PHP array_diff weirdness
Это такая простая проблема, но в документе PHP не объясняется, почему это происходит.
У меня есть этот код:
var_dump($newattributes); var_dump($oldattributes);
var_dump(array_diff($newattributes, $oldattributes));
Для краткости я собираюсь опустить большие части структуры, которую я фактически использую (поскольку каждый из них составляет 117 элементов) и разрезаем на случай.
У меня есть один массив с именем $newattributes
, который выглядит так:
array(117){
// Lots of other attributes here
["deleted"] => int(1)
}
А другой называется $oldattributes
, который выглядит так:
array(117){
// Lots of other attributes here
["deleted"] => string(1) "0"
}
Что выглядит по-другому? Согласно array_diff
: нет. Выход из array_diff
:
array(0) { }
Я прочитал страницу документации, однако он говорит:
Два элемента считаются равными тогда и только тогда, когда (строка) $elem1 === (строка) $elem2. В словах: когда строковое представление одно и то же.
И я не уверен, как "1" может объектировать равный "0".
Как я вижу некоторые оговорки с array_diff
, я не принимал во внимание?
Ответы
Ответ 1
Проблема может заключаться в том, что вы используете ассоциативные массивы: вы должны попробовать и использовать следующие для ассоциативных массивов: array_diff_assoc():
<?php
$newattributes = array(
"deleted" => 1
);
$oldattributes = array(
"deleted" => "0"
);
$result = array_diff_assoc($newattributes, $oldattributes);
var_dump($result);
?>
результат:
array(1) {
["deleted"]=>
int(1)
}
Ответ 2
Это случается и со мной (когда есть больше значений, чем один)
$new = array('test' => true, 'bla' => 'test' 'deleted' => 1);
$old = array('test' => true, 'deleted' => '0');
Для полного array_diff вам нужно сделать дополнительную работу, потому что по умолчанию она возвращает относительный дополнение
Попробуйте следующее:
array_diff(array_merge($new, $old), array_intersect($new, $old))
Результат:
Array
(
[bla] => test
[deleted] => 0
)