【问题标题】:Check if two arrays have the same values检查两个数组是否具有相同的值
【发布时间】:2014-02-03 23:39:43
【问题描述】:
[2,5,3]    

[5,2,3]

它们是相等的,因为它们具有相同的值,但顺序不同。我可以在不使用 in_array() 的 foreach 循环的情况下发现这一点吗?我不认为它会有效。

【问题讨论】:

  • array_diff() 并不完美。排序而不是比较最好的。
  • @jeroen:运行这个:`$array = array(4,3); $array2 = 数组(2,3,4); echo var_dump(array_diff($array,$array2));'
  • @SureshKamrushi 不错!
  • 所以 array_diff 不起作用?
  • 在我写这篇文章的时候,所有给定的解决方案都没有真正起作用。它们都以布尔值失败。

标签: php arrays


【解决方案1】:
sort($a);
sort($b);
if ($a===$b) {//equal}

【讨论】:

  • 我不会接受这个答案。对于 ['a'][true] 返回 true。
  • 注意,测试 sort($a) == sort($b) 总是返回 true,我假设因为 PHP 正在检查 sort() 的返回值,可能是 1,而不是查看数组。
  • 这不是最佳答案,排序会影响数组值。它并非在所有情况下都有效
  • @JayBienvenu 用=== 代替== 测试了这个案例,['a'][true] 返回false。
  • 如果是===,我会投赞成票,但没有那个额外的=这不是最正确的答案
【解决方案2】:
$array1 = array(2,5,3);
$array2 = array(5,2,3);
$result = array_diff($array1, $array2);
if(empty($result))
{
   echo "Both arrays are equal.";
}
else
{
   echo "Both arrays are different.";
}

【讨论】:

  • 这不正确。您的代码示例将失败 $array1 = array(2,5,3, 3); $array2 = 数组(5,2,3); array_diff 检查两个数组中有哪些值,它不关心它们在那里的频率。
  • @Matthias Huttar 是正确的 .. 不幸的是,我不得不努力去发现 ..
  • 另外,array_diff“将 array1 与一个或多个其他数组进行比较,并返回 array1 中不存在于任何其他数组中的值。”因此,例如,如果 $array2 具有比 $array1 更多的不同值,则此答案中的代码会错误地将数组报告为相等。这是@SureshKamrushi 在问题下的评论中提到的一点。
  • 我可以建议对这个答案使用 array_unique 吗?
【解决方案3】:

这对聚会来说有点晚了,但希望它有用:

如果您确定数组都只包含字符串或都只包含整数,那么array_count_values($a) == array_count_values($b) 具有更好的时间复杂度。不过user1844933的回答比较笼统。

【讨论】:

  • 如果整数有冲突(意味着第一个值为-1,第二个值为+1),这将失败,计算值将等于两个数组,但它们是不同的数组.
  • @kindaian 请演示array_count_values() 何时可能产生负值。
【解决方案4】:

如果您不想对数组进行排序,而只想检查是否相等而不考虑值顺序,请使用 http://php.net/manual/en/function.array-intersect.php,如下所示:

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

【讨论】:

  • 此解决方案不考虑项目的重复。例如:根据上述逻辑,[2,5,3] & [5,2,3,3] 将相等。
  • 你好先生,如果 $array1 = array(2,5,3,1,9,8); $array2 = 数组(5,2,3);那么它是如何使用的呢?
  • [true][1] 返回 true。
【解决方案5】:

来晚了。我有同样的问题,但不想排序,这是我知道的直接答案。我想出了这个简单的单行仅适用于唯一值数组

$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )

它也比排序选项快 5 倍。并不是说两者都特别慢,所以我想说这更多地取决于您的个人喜好以及您认为哪个更清楚。我个人宁愿不排序。

编辑:感谢 Ray 指出这仅适用于具有唯一值的数组。

【讨论】:

  • 我认为这是最好的答案,接受的答案会留下您可能不想要的实际排序数组 $a 和 $b 的副作用。
  • 再深入一点,这似乎并非在每种情况下都有效,因为 array_diff 会将多个结果合并为一个。这似乎过去了。 $a = ['红色','红色','蓝色','蓝色']; $b = ['红色','红色','红色','蓝色'];
  • 这让我很伤心...我得去看看。我真的不想进行任何排序,但我也不想在$a$b 上抛出unique 来执行此操作...
  • 确实...独特也不能让你摆脱这个。我只在已经删除重复项的用例中使用了这个,所以这个从我的雷达中溜走了。我将添加一个关于这个重要例外的注释。
  • 确实@JayBienvenu,许多PHP函数对类型并不严格。添加这当然是一个有用的注释,因为有时可能会有重要的用例,但考虑到 PHP 在默认情况下实际上是松散类型的,这正是野兽的本性。假装没有意义。您不是在寻找不同的解决方案,而是在寻找不同的语言。
【解决方案6】:

最好的方法是使用array_diff http://php.net/manual/en/function.array-diff.php

$arr1 = [2,5,3];
$arr2 = [5,2,3];

$isEqual = array_diff($arr1,$arr2) === array_diff($arr2,$arr1);

【讨论】:

  • 此解决方案不考虑项目的重复。例如:根据上述逻辑,[2,5,3] & [5,2,3,3] 将相等。 3v4l.org/1SRp7
  • 我最终做了array_diff($arr1, $arr2) === array_diff($arr2, $arr1) && count($arr1) === count($arr2)
  • @Chris 仍然会给你 [2,2,1] 和 [1,1,2] 的误报
【解决方案7】:

我遇到了这个问题并因此解决了它: 我需要确保两个对象具有相同的字段 所以

const expectedFields = ['auth', 'message'];
const receivedFields = Object.keys(data);
const everyItemexists = expectedFields.map(i => receivedFields.indexOf(i) > -1);
const condition = everyItemexists.reduce((accumulator, item) => item && accumulator, true);

基本上,在这里遍历其中一个数组(我假设它们的大小相同)。然后检查它是否存在于另一个数组中。然后我减少那个结果。

【讨论】:

  • 问题是关于php的。
【解决方案8】:

由于没有一个完全与键无关的给定答案适用于重复值(例如 [1,1,2] 等于 [1,2,2]),因此我自己编写了。

此变体不适用于多维数组。它会检查两个数组是否包含完全相同的值,而不管它们的键和顺序如何,而无需修改任何参数。

function array_equals(array $either, array $other) : bool {
    $copy = $either;
    foreach ($other as $element) {
        $key = array_search($element, $copy, true);
        if ($key === false) {
            return false;
        }
        unset($copy[$key]);
    }
    return empty($copy);
}

尽管问题询问了无 foreach 变体,但我找不到任何满足我要求的没有循环的解决方案。此外,大多数其他使用的函数也在内部使用循环。

【讨论】:

    【解决方案9】:

    假设你有两个这样定义的数组:

    $array1 = array(2,5,3);
    $array2 = array(5,2,3);
    

    那么就可以用这段代码来判断它们是否相等:

    if(array_diff($array1,$array2) === array_diff($array2,$array1) &&count($array1)==count($array2))
    {
        echo 'Equal';
    }
    else
    {
        echo 'Not equal';
    }
    

    【讨论】:

    • 请在您的回答中添加一些解释
    【解决方案10】:

    如何将数组转换为字符串,然后比较字符串。

    sort($a);
    sort($b);
    $a_str = implode(",", $a);
    $b_str = implode(",", $b);
    f ( strcmp($a_str, $b_str) !== 0)
    {
    }
    

    【讨论】:

      【解决方案11】:
      function array_equal($a, $b){
      return count($a) === count($b) && empty(array_diff($a, $b)) && empty(array_diff($b, $a));
      }
      

      这是准确的解决方案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        相关资源
        最近更新 更多