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]);
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只能处理一个维度,您可以:
将您的多维数组转换为一维,例如:
展平多维数组,例如:
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.
Run Code Online (Sandbox Code Playgroud)序列化数组,例如:
$results = array_diff(array_map('serialize',$a2), array_map('serialize',$a1));
Run Code Online (Sandbox Code Playgroud)使用自定义递归array_diff函数,
根据PHP文档的功能
注意:当且仅当(字符串)$ elem1 ===(字符串)$ elem2时,两个元素被认为是相等的.用文字表示:当字符串表示相同时.
有关更多信息,请参阅http://php.net/manual/en/function.array-diff.php
您可以在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)
| 归档时间: |
|
| 查看次数: |
31636 次 |
| 最近记录: |