【问题标题】:Compare two associative arrays regarding the order of keys比较两个关联数组的键顺序
【发布时间】:2013-07-29 12:33:37
【问题描述】:

假设,我们有 2 个关联数组:

<?php
$array1 = array(
    1 => 2,
    2 => 1,
);

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

它们包含相同的元素,但顺序不同。我想写一个比较函数,只有在以下情况下才会为真:

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

所以,我尝试了以下方法:

1 次尝试

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

打印:相等

2 次尝试

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;
}

这可以修复,使用递归函数,按数据类型切换。但是这个简化版对我来说还可以。

这种比较有什么标准解决方案吗?

【问题讨论】:

    标签: php arrays associative-array


    【解决方案1】:

    array operators 中所述,您需要的是=== 相等运算符。

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

    【讨论】:

    • + 用于添加文档链接。
    • 请注意,$array1 === $array2 不能很好地处理对象,即使它们实现了神奇的__toString 方法,您最终也会得到错误
    【解决方案2】:

    你能试试下面这个吗?返回真 如果 key=>value 并且将按任何顺序排列 否则返回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;
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2015-03-31
      相关资源
      最近更新 更多