2016-08-30 3 views
1

PHP documentation ясно заявляетОшибка PHP array_diff?

Сравнивает array1 против одного или нескольких других массивов и возвращает значения в array1, которые не присутствуют ни в одном из других массивов.

Это не совсем так. Рассмотрим следующий пример

$a = array(1,2,3,4); 
$b = array(3,4,5); 
echo "b FROM a = "; 
echo json_encode(array_diff($a,$b)); 
echo "<br>a FROM b = "; 
echo json_encode(array_diff($b,$a)); 

который возвращает

b FROM a = [1,2] 
a FROM b = {"2":5} 

т.е. простом массиве в одном случае и ассоциативного массива в другой. Легко исправлено - я только забочусь о значениях, поэтому могу просто сделать array_values(array_diff. Однако меня беспокоит, что документация заслоняет эту разницу. Возможно, кто-то здесь может проливать больше света на то, что происходит?

+1

Подсказка: используйте 'print_r'/'var_dump' для отладки PHP v alues. Внедрение целой «новой технологии» (JSON) в микс просто усложняет ситуацию ... – deceze

+0

Хорошая точка. Я часто использую json_encode просто потому, что результат более компактный. – DroidOS

ответ

3

Это не PHP, что делает что-то волшебное, это JSON

array_diff() поддерживает ключи/ассоциативность

b from a возвращает

array(
    0 => 1 
    1 => 2 
) 

a from b возвращает

array(
    2 => 5 
) 

При преобразовании json, json doesn «Т возиться с ключами, если они являются числовыми от 0 и увеличивается на 1, так что ключи от b from a игнорируются в JSON, так как они соответствуют критериям, что

Однако ключ от a from b результата не естественно приращением от 0, поэтому они хранятся в формате JSON

Если вы не хотите, чтобы сохранить ключ ассоциативность, используйте

echo json_encode(array_values(array_diff($b,$a))); 

сбросить ключи, как естественно Инкрементирование

+0

Ницца ... однако, интересно, где в документах вы видите, что он явно упоминает, что _array_diff() сопоставляет ключи/ассоциативность_. Я ничего подобного не вижу. – DroidOS

+0

'Возвращает массив, содержащий все __entries__ из массива1, которые не присутствуют ни в одном из других массивов. 'Использует термин' entries', который обычно означает как ключи, так и значения; в этом примере также указывается, что клавиши поддерживаются ('Array ( [1] => синий )') –

Смежные вопросы