次の行で配列から文字列への変換エラーが発生します。
_$diff = array_diff($stockist, $arr);
_
ここで、_$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>";
}
_
それによると:
_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_diff
_は、n次元配列の1つの次元のみをチェックします。もちろん、array_diff($array1[0], $array2[0]);
を使用して、より深い次元をチェックできます
はい、厳密な答えは「配列の1つが多次元である」ためです。
もう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));
これらのオプションはすべて、最上位レベルだけでなく、アレイツリー全体を比較します。
array_diff
は1つのディメンションのみを処理できます。次のいずれかを実行できます。
多次元配列を1つの次元に変換します。によって:
カスタム 再帰array_diff
- like関数 、
PHP関数のドキュメントによると
注:(string)$ elem1 ===(string)$ elem2の場合にのみ、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。
詳細については http://php.net/manual/en/function.array-diff.php を参照してください
array_diff()documentation で次のことがわかります:
(string)$ elem1 ===(string)$ elem2の場合にのみ、2つの要素は等しいと見なされます。つまり、文字列表現が同じ場合。
したがって、この関数を多次元配列、または実際には文字列に変換できない値で使用できないようです。これは、関数が値をstring
にキャストして比較を行うためです。
配列の違いを再帰的に確認する独自の関数を作成できます。実際、以下は上記のリンクされたドキュメントのコメントからのものです。
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;
}
同じエラーが発生し、次のphpのバグレポートが見つかりました。
https://bugs.php.net/bug.php?id=60198
複数の配列の要素を比較する一部のarray_ *関数は、(string)$ elem1 ===(string)$ elem2によって比較します。
$ elem1または$ elem2が配列の場合、文字列通知への配列がスローされます。
これをスローできる関数の2つの例は、array_intersect()とarray_diff()です。
これらの関数が値として他の配列を含む配列を取ることが期待されない場合、これはドキュメントページで言及されるべきです。
そのレポートでは、多次元配列の比較でphpがエラーをスローする理由について説明しています。
私のソリューションはどうですか:
$diff = strcmp(serialize($arr1), serialize($arr2))