Why array_diff() gives Array to string conversion

2020-03-01 01:49发布

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>";
}

7条回答
看我几分像从前
2楼-- · 2020-03-01 02:29

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

查看更多
一夜七次
3楼-- · 2020-03-01 02:30

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.

查看更多
不美不萌又怎样
4楼-- · 2020-03-01 02:30

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; 
}
查看更多
迷人小祖宗
5楼-- · 2020-03-01 02:33

Since array_diff can only deals with one dimension, you can either:

查看更多
来,给爷笑一个
6楼-- · 2020-03-01 02:37

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楼-- · 2020-03-01 02:38

What about my solution:

$diff = strcmp(serialize($arr1), serialize($arr2))
查看更多
登录 后发表回答