为什么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表示是相同的。
由于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));
-
-
使用自定义recursion
array_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时抛出一个错误。