为什么array_diff()给Array提供字符串转换错误?

use*_*765 52 php arrays multidimensional-array array-difference

我得到以下行的数组到字符串转换错误:

$diff = array_diff($stockist, $arr);
Run Code Online (Sandbox Code Playgroud)

$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>";
}
Run Code Online (Sandbox Code Playgroud)

Via*_*iuk 33

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
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说似乎是一个错误."数组到字符串转换"消息充其量是误导性的. (10认同)
  • 快2020年了,这条信息仍然误导我 (10认同)
  • 现在已经是 2021 年了,我讨厌一切。 (8认同)
  • 现在已经是 2020 年了,我同样对这个错误感到困惑。 (2认同)

E.A*_*A.T 18

是的,严格的答案是因为"你的一个阵列是多维的".

另一个有用的注意事项可能是 - 根据您需要进一步解析实际差异 - 考虑首先测试您的数组:

$diff = strcmp(json_encode($stockist), json_encode($arr));
Run Code Online (Sandbox Code Playgroud)

要么

$diff = strspn(json_encode($stockist) ^ json_encode($arr), "\0");
Run Code Online (Sandbox Code Playgroud)

要么

$diff = xdiff_string_diff(json_encode($stockist), json_encode($arr));
Run Code Online (Sandbox Code Playgroud)

所有这些选项都将比较整个数组树,而不仅仅是顶层.


ken*_*orb 12

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

  • 多维数组的扁平化是错误的。当接近第一个嵌套数组时,函数会忘记原始 $arr 中的所有其他值。 (2认同)
  • 完善!反序列化的工作方式与最不赞成的答案相反。只需要做$ results = array_map('unserialize',$ results); 读后记 (2认同)

max*_*max 7

根据PHP文档的功能

注意:当且仅当(字符串)$ elem1 ===(字符串)$ elem2时,两个元素被认为是相等的.用文字表示:当字符串表示相同时.

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


Jim*_*ght 5

您可以在array_diff() 文档中看到:

当且仅当 (string) $elem1 === (string) $elem2 时才认为两个元素相等。换句话说:当字符串表示相同时。

所以看起来你不能将此函数用于多维数组,或者实际上任何无法转换为字符串的值。这是因为该函数会将值转换为 astring来进行比较。

您可以编写自己的函数来递归检查数组的差异 - 事实上,以下内容来自上面链接的文档的评论。

你可以在这里看到评论

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; 
}
Run Code Online (Sandbox Code Playgroud)

  • 令人震惊的是,PHP 语言编写者认为不编写该函数的递归版本也没什么问题。并保留数组到字符串转换错误,而不是让错误显示“不支持多维数组”之类的内容 (3认同)