为什么array_diff()给数组string转换错误?

我得到数组到string转换错误为以下行:

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

这里, $arr是一个从JSON文件解码的数组。 使用is_array()函数我能够validation这两个参数是数组。 有人可以指出我的问题

 $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]);来检查更深的维度array_diff($array1[0], $array2[0]);

是的,严格的答案是因为“你的一个arrays是多维的”。

另一个有用的注意事项可能是 – 根据您进一步parsing实际差异的需要 – 考虑首先testing您的arrays:

 $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文档的function

注意:当且仅当(string)$ elem1 ===(string)$ elem2时,两个元素被认为是相等的。 用词表示:当string表示是相同的。

有关更多信息,请参阅http://php.net/manual/en/function.array-diff.php

由于array_diff只能处理一个维度,因此您可以:

  • 将multidimensional array转换为一维,例如:

    • 展平一个multidimensional array ,例如:

       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)); 
  • 使用自定义recursionarray_diff类的函数 ,

我有相同的错误,并find了以下错误报告为PHP:

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

一些比较多个数组中的元素的array_ *函数是通过(string)$ elem1 ===(string)$ elem2来完成的。

如果$ elem1或$ elem2是一个数组,则抛出string通知的数组。

可以抛出这个的函数的两个例子是array_intersect()和array_diff()。

如果这些函数不希望将其他数组的数组作为值,则应在文档页面中提及。

该报告描述了为什么PHP在比较multidimensional array时抛出一个错误。