72

次の行で配列から文字列への変換エラーが発生します。

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

これは、 JSON$arrファイルからデコードされた配列です。関数を使用して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>";
}
4

10 に答える 10

49

それによると:

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

配列の 1 つが多次元です。

array_diffn 次元配列の 1 つの次元のみをチェックします。もちろん、使用してより深い次元を確認できますarray_diff($array1[0], $array2[0]);

于 2013-11-07T08:09:36.617 に答える
26

はい、厳密な答えは、「配列の 1 つが多次元である」ためです。

別の有用な注意事項として、実際の違いをさらに解析する必要がある場合に応じて、最初に配列を次のようにテストすることを検討してください。

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

これらのオプションはすべて、トップ レベルだけでなく、配列ツリー全体を比較します。

于 2015-08-14T12:39:24.347 に答える
7

関数のPHPドキュメントによると

注: (文字列) $elem1 === (文字列) $elem2 の場合に限り、2 つの要素は等しいと見なされます。つまり、文字列表現が同じ場合です。

詳細については、http://php.net/manual/en/function.array-diff.phpを参照してください。

于 2013-11-07T08:08:31.747 に答える
6

array_diff() のドキュメントで次のことがわかります。

(文字列) $elem1 === (文字列) $elem2 の場合に限り、2 つの要素は等しいと見なされます。つまり、文字列表現が同じ場合です。

したがって、この関数を多次元配列、または実際には文字列に変換できない値では使用できないようです。これは、関数がstring比較を行うために値を a にキャストするためです。

独自の関数を作成して、配列の違いを再帰的にチェックすることができます。実際、以下は上記のリンクにあるドキュメントのコメントからのものです。

コメントはこちらでご覧いただけます。

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; 
}
于 2018-08-22T21:21:42.073 に答える
1

同じエラーが発生し、php の次のバグ レポートを見つけました。

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

複数の配列の要素を比較する array_* 関数の一部は、(string)$elem1 === (string)$elem2 で比較します。

$elem1 または $elem2 が配列の場合、配列から文字列への通知がスローされます。

これをスローできる関数の 2 つの例は、array_intersect() と array_diff() です。

これらの関数が他の配列を値として持つ配列を受け取ることが想定されていない場合は、ドキュメント ページにその旨を記載する必要があります。

そのレポートには、多次元配列の比較で php がエラーをスローする理由が説明されています。

于 2014-03-06T13:25:29.690 に答える