usort
その理由は、PHPソースやarray_uintersect
他の同様のユーザーコールバック比較関数にあると思います。php_array_user_compare
xref: /PHP_5_3/ext/standard/array.c
568static int php_array_user_compare(const void *a, const void *b TSRMLS_DC) /* {{{ */
569{
570 Bucket *f;
571 Bucket *s;
572 zval **args[2];
573 zval *retval_ptr = NULL;
574
575 f = *((Bucket **) a);
576 s = *((Bucket **) b);
577
578 args[0] = (zval **) f->pData;
579 args[1] = (zval **) s->pData;
580
581 BG(user_compare_fci).param_count = 2;
582 BG(user_compare_fci).params = args;
583 BG(user_compare_fci).retval_ptr_ptr = &retval_ptr;
584 BG(user_compare_fci).no_separation = 0;
585 if (zend_call_function(&BG(user_compare_fci), &BG(user_compare_fci_cache) TSRMLS_CC) == SUCCESS && retval_ptr) {
586 long retval;
587
588 convert_to_long_ex(&retval_ptr);
589 retval = Z_LVAL_P(retval_ptr);
590 zval_ptr_dtor(&retval_ptr);
591 return retval < 0 ? -1 : retval > 0 ? 1 : 0;
592 } else {
593 return 0;
594 }
595}
これretval
は、整数であるwhichを使用して、関数を比較します。
retval < 0 ? -1 : retval > 0 ? 1 : 0
ブール値を使用していて、変換が必要な場合は、0
または1
例
var_dump((int) true); // 1
var_dump((int) false); // 0
これは、必要な場所のみが必要であり、他の実装では必要ないため、 boolean
交差中に回避できる可能性があることを意味します。$a === $b = 0
retval < 0