Это действительно несколько интригующе.Я посмотрел последний источник PHP на github (который написан на C ++, как вы, наверное, знаете) и попытался разобраться в этом.(https://github.com/php/php-src/blob/master/ext/standard/array.c)
Быстрый поиск показал, что рассматриваемая функция объявлена в строке 4308
PHP_FUNCTION(array_diff_uassoc)
{
php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);
}
Так что это показывает, что фактическая работа выполняется функцией php_array_diff
,это можно найти в том же файле в строке 3938. Вставить его сюда немного длиннее, если быть точным, 265 строк, но вы можете посмотреть его, если хотите.
Именно здесь я и далЯ не имею никакого опыта в C, и это слишком поздно, и я устал, чтобы попытаться разобраться в этом. Я полагаю, сначала выполняется сравнение ключей, так как оно, вероятно, более производительно, чем сравнение значений, но этоэто всего лишь предположение. В любом случае, вероятно, есть веская причина, почему они делают это так, как они делают.
Все, что нужно, это длинное вступление, чтобы сказать: зачем вам ставить * 1013?* внутри вашей compare
функции в первую очередь ? Целью array_diff_uassoc
является вывод функции. Вы не должны полагаться на то, как парсер обрабатывает ее. Если они решат завтра изменить внутреннюю работу этогоC funcт. е.сначала сделайте сравнение значений, вы получите совершенно другой результат.
Возможно, вы могли бы использовать эту функцию замены, написанную на php: http://pear.php.net/reference/PHP_Compat-1.6.0a2/__filesource/fsource_PHP_Compat__PHP_Compat-1.6.0a2CompatFunctionarray_diff_uassoc.php.html
Таким образом, вы можете полагайтесь на то, что поведение не меняется, и вы полностью контролируете внутреннюю работу ...