比较数组时文档说
$a == $b 相等 如果 $a 和 $b 具有相同的键/值对,则为 TRUE。
虽然与多维数组相比,情况似乎并非如此
$a = array(
array("test"),
array("testing"),
);
$b = array(
array("testing"),
array("test"),
);
var_dump($a);
var_dump($b);
var_dump($a == $b);
退货
array(2) {
[0] =>
array(1) {
[0] =>
string(4) "test"
}
[1] =>
array(1) {
[0] =>
string(7) "testing"
}
}
array(2) {
[0] =>
array(1) {
[0] =>
string(7) "testing"
}
[1] =>
array(1) {
[0] =>
string(4) "test"
}
}
bool(false)
相同的数组,不同的顺序。
array_diff()
虽然返回正确。
这是预期的功能吗?我知道我可以与
array_diff($a,$b) + array($b, $a)
进行比较。我不确定为什么 ==
不起作用。
这是因为你的数组在叶节点中不同。
在您的第一个数组中
0
= test
和在您的第二个数组中 0
= testing
。
==
符号允许以任何顺序比较数组,它将在内部使用主数组上的排序并进行 ===
比较。
但是它不会对子数组进行排序,您需要在比较之前手动进行排序
注意:请参阅 == 和 === 的区别 详细信息请参见此处
我必须消除问题中的一些错误断言。
正确返回。array_diff()
还有
我知道我可以与
比较。array_diff($a,$b) + array($b, $a)
对结果的这种解释称为“误报”。事实上,
array_diff()
不具备精确比较多维输入数据的能力。
当给
array_diff()
一个多维数组时,PHP 将通过通知或警告(取决于版本号)进行抱怨,因为该函数被设计为对标量值进行松散比较。 在您的情况下,在发出可静音的投诉后,PHP 将耸耸肩,并将整个项目有效负载转换为字符串 Array
。 以下示例有两个不同的有效负载,但 array_intersect()
表示它们是相同的,因为它们的计算结果都是 Array
。 演示
$array = ['key' => ['val']];
$match = ['Array'];
var_export(
array_intersect($array, $match)
);
输出:
Warning: Array to string conversion
array (
'key' =>
array (
0 => 'val',
),
)
为了能够比较行数据,您需要利用
array_udiff()
以便可以比较非平面结构。要在没有双向差异时返回 true
,可以使用以下代码片段。 演示
var_export(
!(
array_udiff($first, $second, fn($a, $b) => $a <=> $b)
+ array_udiff($second, $first, fn($a, $b) => $a <=> $b)
)
);