问题
I get array to string conversion error for the following line:
$diff = array_diff($stockist, $arr);
Here, $arr
is an array decoded from a JSON file. Using the is_array()
function I was able to verify that both parameters are arrays. Can someone point me the problem
$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:
According to it:
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
One of your arrays is multidimensional.
array_diff
only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);
回答2:
Yes, the strict answer is because "One of your arrays is multidimensional."
Another useful note might be - depending on your needs of further parsing the actual differences - consider first testing your arrays with:
$diff = strcmp(json_encode($stockist), json_encode($arr));
or
$diff = strspn(json_encode($stockist) ^ json_encode($arr), "\0");
or
$diff = xdiff_string_diff(json_encode($stockist), json_encode($arr));
All these options will compare the entire array tree, not just the top level.
回答3:
Since array_diff
can only deals with one dimension, you can either:
convert your multi-dimentional array into one dimension, e.g. by:
flattening a multidimensional array, e.g.:
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.
serializing the array, e.g.:
$results = array_diff(array_map('serialize',$a2), array_map('serialize',$a1));
use custom recursive array_diff-like function,
回答4:
According to PHP documentation for the function
Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.
For more information refer to http://php.net/manual/en/function.array-diff.php
回答5:
You can see in the array_diff() documentation that:
Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In other words: when the string representation is the same.
So it looks like you can't use this function with multi dimensional array, or in fact any value that cannot be converted to a string. This is because the function will cast values to a string
to do the comparison.
You can write your own function to recursively check arrays for a difference - in fact the following is from the comments of the docs linked above.
You can see the comment here.
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:
I've got the same error and found the following bug report for php:
https://bugs.php.net/bug.php?id=60198
Some of the array_* functions that compare elements in multiple arrays do so by (string)$elem1 === (string)$elem2.
If $elem1 or $elem2 is an array, then the array to string notice is thrown.
Two examples of functions that can throw this are array_intersect() and array_diff().
If these functions are not expected to take arrays with other arrays as values, this should be mentioned on the documentation pages.
That report describes, why php throws an error on comparing a multi-dimensional array.
回答7:
What about my solution:
$diff = strcmp(serialize($arr1), serialize($arr2))
来源:https://stackoverflow.com/questions/19830585/why-array-diff-gives-array-to-string-conversion-error