尽管在不同顺序的行中具有相同的数据,但两个二维数组松散地评估为不相等

问题描述 投票:0回答:4

比较数组时文档

$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)
进行比较。我不确定为什么
==
不起作用。

php arrays multidimensional-array comparison array-difference
4个回答
1
投票

这是因为你的数组在叶节点中不同。

在您的第一个数组中

0
=
test
和在您的第二个数组中
0
=
testing


0
投票

使用 === 比较来处理按键顺序。

检查此来源:

比较 PHP 中的多维数组

问候


0
投票

==
符号允许以任何顺序比较数组,它将在内部使用主数组上的排序并进行
===
比较。

但是它不会对子数组进行排序,您需要在比较之前手动进行排序

注意:请参阅 == 和 === 的区别 详细信息请参见此处


0
投票

我必须消除问题中的一些错误断言。

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)
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.