Я получаю массив для строковой ошибки преобразования для следующей строки:
$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>"; }
В соответствии с этим:
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 выдает ошибку при сравнении многомерного массива.