比较两个关联数组的键顺序。

3
假设我们有两个关联数组:
<?php
$array1 = array(
    1 => 2,
    2 => 1,
);

$array2 = array(
    2 => 1,
    1 => 2,
);

这些数组包含相同的元素,但顺序不同。我想编写一个比较函数,只有在以下情况下才会返回true:

  1. 数组具有相同的键值对。
  2. 键值对的顺序相同。

因此,我尝试了以下方法:

第一次尝试

if ($array1 == $array2)
{
    print "equal\n";
}

输出结果:相等

第二次尝试

print count(array_diff_assoc($array1, $array1));

打印: 0

我的自定义函数

然后我创建了以下函数:

function compare(&$array1, &$array2)
{
    $n1 = count($array1);
    $n2 = count($array2);
    if ($n1 == $n2)
    {
        $keys1 = array_keys($array1);
        $keys2 = array_keys($array2);
        for ($i = 0; $i < $n1; ++$i)
        {
            if ($keys1[$i] == $keys2[$i])
            {
                if ($array1[$keys1[$i]] != $array2[$keys2[$i]])
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        return true;
    }
    else
    {
        return false;
    }
}

这段代码在正常情况下是有效的,但当我们想针对嵌套的数组应用严格比较时,由于 if 语句中的 != 运算符,它将无法正常工作:

if ($array1[$keys1[$i]] != $array2[$keys2[$i]])
{
       return false;
}

可以使用递归函数,根据数据类型进行切换来解决这个问题。但是对我来说,这个简化版本已经足够好了。

是否有标准的解决方案来处理这种类型的比较?

2个回答

6

数组运算符中所述,您需要使用===等于运算符。

if ($array1 === $array2) {
    echo "same key pairs and same element order\n";
}

  • 用于添加文档链接的加号。
- Jason McCreary
2
请注意,“$array1 === $array2”在处理对象时表现不佳,即使它们实现了魔术方法“__toString”,最终结果总是false。 - Elias Van Ootegem

0

你可以尝试下面这个代码。如果键值对无论顺序如何都返回 true,否则返回 false。

$array1 = array(
1 => 2,
2 => 1);           
$array2 = array(
2 => 1,
1 => 2);

var_dump(compareArray($array1,$array2));

function compareArray ($array1, $array2)
{

foreach ($array1 as $key => $value)

{

if ($array2[$key] != $value)

 {


return false;
}

 }
return true;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接