Почему 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>"; } 

Solutions Collecting From Web of "Почему array_diff () дает Array ошибку строковой конверсии?"

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

 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]);

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

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

 $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)); 

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

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

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

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

Поскольку array_diff может array_diff только с одним измерением, вы можете:

  • преобразуйте многомерный массив в один размер, например:

    • сглаживание многомерного массива , например:

       while ($arr) { list($key, $value) = each($arr); is_array($value) ? $arr = $value : $out[$key] = $value; unset($arr[$key]); } // Now $out is flatten version of $arr. с while ($arr) { list($key, $value) = each($arr); is_array($value) ? $arr = $value : $out[$key] = $value; unset($arr[$key]); } // Now $out is flatten version of $arr. 
    • сериализация массива , например:

       $results = array_diff(array_map('serialize',$a2), array_map('serialize',$a1)); 
  • использовать пользовательскую рекурсивную функцию array_diff ,

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

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

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

Если $ elem1 или $ elem2 является массивом, то бросается массив в строку уведомления.

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

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

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