Почему array_diff() дает Array ошибку строковой конверсии?

Я получаю массив для строковой ошибки преобразования для следующей строки:

$diff = array_diff($stockist, $arr);

Здесь $arr - это массив, декодированный из файла JSON. Используя функцию is_array(), я смог проверить, что оба параметра являются массивами. Может кто-нибудь указать мне на проблему

$stockist = array();
while (!feof($file_handle)) {

    $line_of_text = fgetcsv($file_handle);
    $query = "SELECT * FROM reorderchart WHERE medicine = '"
        . trim($line_of_text[3])
        . "' ORDER BY medicine";
    $result = mysql_query($query);

    if (trim($line_of_text[2]) - trim($line_of_text[1]) <= 0) {

        while ($row = mysql_fetch_array($result)) {

            $file = "results.json";
            $arr = json_decode(file_get_contents($file),true);
            $pharmacy = trim($row['Medicine']);

            if (isset($stockist[$pharmacy])) {

                $medicine = $stockist[$pharmacy];
                $medicine[] = trim($row['Stockist']);
                $stockist[$pharmacy] = $medicine;

            } else {

                $medicine = array();
                $medicine[] = trim($row['Stockist']);
                $stockist[$pharmacy] = $medicine;
            }
        }
    }
}
$diff = array();
$diff = array_diff_assoc($stockist,$arr);
ksort($diff);
foreach ($diff as $key => $value) {

    echo "<table align='center' border='1'>";
    echo "<tr><td align = 'center'> <font color = 'blue'> $key</td></tr>";

    foreach($value as $key1 => $value1) {

        echo "<tr><td align ='center'>$value1</td></tr><br>";
    }
    echo "</table>";
}

Ответ 1

В соответствии с этим:

php -r 'array_diff(array("a" => array("b" => 4)), array(1));'
PHP Notice:  Array to string conversion in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. array_diff() Command line code:1

Один из ваших массивов является многомерным.

array_diff проверяет только одно измерение n-мерного массива. Конечно, вы можете проверить более глубокие размеры, используя array_diff($array1[0], $array2[0]);

Ответ 2

Да, строгий ответ объясняется тем, что "один из ваших массивов является многомерным".

Еще одно полезное замечание - в зависимости от ваших потребностей в дальнейшем анализе фактических различий - рассмотрите сначала тестирование своих массивов с помощью:

$diff = strcmp(json_encode($stockist), json_encode($arr));

или

$diff = strspn(json_encode($stockist) ^ json_encode($arr), "\0");

или

$diff = xdiff_string_diff(json_encode($stockist), json_encode($arr));

Все эти параметры будут сравнивать все дерево массивов, а не только верхний уровень.

Ответ 3

Так как array_diff может работать только с одним измерением, вы можете:

Ответ 4

Согласно документации PHP для функции

Примечание: Два элемента считаются равными тогда и только тогда, когда (string) $elem1 === (string) $elem2. В словах: когда строковое представление одно и то же.

Для получения дополнительной информации см. http://php.net/manual/en/function.array-diff.php

Ответ 5

В документации array_diff() вы можете увидеть, что:

Два элемента считаются равными тогда и только тогда, когда (строка) $ elem1 === (строка) $ elem2. Другими словами: когда строковое представление является то же самое.

Таким образом, похоже, что вы не можете использовать эту функцию с многомерным массивом, или на самом деле любое значение, которое не может быть преобразовано в строку. Это потому, что функция будет приводить значения в string для сравнения.

Вы можете написать свою собственную функцию, чтобы рекурсивно проверять массивы на наличие различий - на самом деле, это приведено в комментариях к указанным выше документам.

Вы можете увидеть комментарий здесь.

function arrayRecursiveDiff($aArray1, $aArray2) { 
    $aReturn = array(); 

    foreach ($aArray1 as $mKey => $mValue) { 
        if (array_key_exists($mKey, $aArray2)) { 
            if (is_array($mValue)) { 
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]); 
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; } 
            } else { 
                if ($mValue != $aArray2[$mKey]) { 
                    $aReturn[$mKey] = $mValue; 
                } 
            } 
        } else { 
            $aReturn[$mKey] = $mValue; 
        } 
    } 

    return $aReturn; 
}

Ответ 6

У меня такая же ошибка, и я нашел следующий отчет об ошибке для php:

https://bugs.php.net/bug.php?id=60198

Некоторые из функций array_ *, которые сравнивают элементы в нескольких массивах сделайте это по (string) $elem1 === (string) $elem2.

Если $elem1 или $elem2 - это массив, тогда массив, который будет отмечен в строке, выброшены.

Два примера функций, которые могут вызвать это, - array_intersect() и array_diff().

Если эти функции не будут принимать массивы с другими массивами как значения, это следует упомянуть на страницах документации.

В этом отчете описывается, почему php выдает ошибку при сравнении многомерного массива.

Ответ 7

Как насчет моего решения:

$diff = strcmp(serialize($arr1), serialize($arr2))