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
)