【问题标题】:Compare multidimensional arrays in PHP比较 PHP 中的多维数组
【发布时间】:2011-11-15 09:26:45
【问题描述】:

如何比较 php 中的多维数组?有没有简单的方法?

【问题讨论】:

标签: php arrays multidimensional-array compare


【解决方案1】:

我知道的最简单的方法:

$a == $b;

请注意,您也可以使用===。它们之间的区别是:

  1. 对于双等号 ==,顺序很重要:

    $a = array(0 => 'a', 1 => 'b');
    $b = array(1 => 'b', 0 => 'a');
    var_dump($a == $b);  // true
    var_dump($a === $b); // false
    
  2. 使用 三等号 ===,类型很重要:

    $a = array(0, 1);
    $b = array('0', '1');
    var_dump($a == $b);  // true
    var_dump($a === $b); // false
    

参考:Array operators

【讨论】:

  • 这不会比较数组元素的顺序和类型。
  • 但是:array(0, 1) != array(1, 0),所以它取决于键/索引。
  • @DanMan 如果array(0, 1) == array(1, 0) 是真的,那就没有多大意义了,不是吗?
  • @DanMan 听起来你想使用 [set](en.wikipedia.org/wiki/Set_(abstract_data_type%29)。PHP 没有内置的 set 类型,但你可以创建一个。元素的顺序很重要在一个数组中。
【解决方案2】:

要比较数组的结构,你应该使用恒等运算符。

if($arrayA === $arrayB) {
    ...
}

【讨论】:

  • 这和我的答案之间的唯一区别是,它不是使用== 作为数组中的元素,而是使用===,并使用=== 检查顺序键值对。根据我从问题中了解到的情况,OP 想要 ==NOT ===。如果 OP 对此感兴趣,我还会在我的答案上添加一个链接。
  • 这里的一个符号有很大的不同。
  • 所以你告诉我给定$a = array(1 => 'a', 0 => 'b'); $b = array(0 => 'b', 1 => 'a');,OP 想要一些会返回 false 的东西?很有趣。
  • 作者想要“比较它们(数组)是否具有完全相同的内容和相同的结构”。检查 PHP 示例: $b = array(1 => "banana", "0" => "apple"); var_dump($a == $b); // bool(true) var_dump($a === $b); // bool(false)
  • 大家好,感谢您的帮助。但是你只告诉我比较一维数组的方法。但是如何比较二维或三维数组呢?像示例:a = array(1 => 'a', 0 => array(1 => 'b')); $b = array(1 => "banana", "0" => array(0 => 'apple')); ?
【解决方案3】:
function multi_diff($arr1,$arr2){
  $result = array();
  foreach ($arr1 as $k=>$v){
    if(!isset($arr2[$k])){
      $result[$k] = $v;
    } else {
      if(is_array($v) && is_array($arr2[$k])){
        $diff = multi_diff($v, $arr2[$k]);
        if(!empty($diff))
          $result[$k] = $diff;
      }
    }
  }
  return $result;
}

//example:

var_dump(multi_diff(

array(
  "A"=>array(
    "A1"=>array('A1-0','A1-1','A1-2','A1-3'),
    "A2"=>array('A2-0','A2-1','A2-2','A2-3'),
    "A3"=>array('A3-0','A3-1','A3-2','A3-3')
  ),
  "B"=>array(
    "B1"=>array('B1-0','B1-1','B1-2','B1-3'),
    "B2"=>array('B2-0','B2-1','B2-2','B2-3'),
    "B3"=>array('B3-0','B3-1','B3-2','B3-3')
  ),
  "C"=>array(
    "C1"=>array('C1-0','C1-1','C1-2','C1-3'),
    "C2"=>array('C2-0','C2-1','C2-2','C2-3'),
    "C3"=>array('C3-0','C3-1','C3-2','C3-3')
  ),
  "D"=>array(
    "D1"=>array('D1-0','D1-1','D1-2','D1-3'),
    "D2"=>array('D2-0','D2-1','D2-2','D2-3'),
    "D3"=>array('D3-0','D3-1','D3-2','D3-3')
  )
),

array(
  "A"=>array(
    "A1"=>array('A1-0','A1-1','A1-2','A1-3'),
    "A2"=>array('A2-0','A2-1','A2-2','A2-3'),
    "A3"=>array('A3-0','A3-1','A3-2')
  ),
  "B"=>array(
    "B1"=>array('B1-0','B1-2','B1-3'),
    "B2"=>array('B2-0','B2-1','B2-2','B2-3'),
    "B3"=>array('B3-0','B3-1','B3-3')
  ),
  "C"=>array(
    "C1"=>array('C1-0','C1-1','C1-2','C1-3'),
    "C3"=>array('C3-0','C3-1')
  ),
  "D"=>array(
    "D1"=>array('D1-0','D1-1','D1-2','D1-3'),
    "D2"=>array('D2-0','D2-1','D2-2','D2-3'),
    "D3"=>array('D3-0','D3-1','D3-2','D3-3')
  )
)

));

【讨论】:

  • 对逻辑的一些解释会是一个更好的答案:)
  • 这不会按 X 处理 X 它只有一层深度
  • 如果第二个数组的元素比第一个多,也不会处理。从 复制的函数的相同问题
  • 你不需要调用内部的函数,你应该调用 array_intersect($v, $arr2[$k]);在函数内部,它将比较数组并返回一个数组给你。
【解决方案4】:

另一种方法是serialize() 两个数组并比较字符串。

http://php.net/manual/en/function.serialize.php

【讨论】:

  • 我正在寻找 C# 和 PowerShell 中的解决方案。你是我的救星:D
  • 注意序列化的数组顺序。 serialize(['a'=>'foo', 'b'=>'bar']) != serialize(['b'=>'bar', 'a'=>'foo'])
【解决方案5】:
$difference = array();
foreach($array1 as $key => $value)
{
    if(is_array($value))
    {
        if(!isset($array2[$key]))
        {
            $difference[$key] = $value;
        }
        elseif(!is_array($array2[$key]))
        {
            $difference[$key] = $value;
        }
        else
        {
            $new_diff = array_diff($value, $array2[$key]);
            if($new_diff != FALSE)
            {
                $difference[$key] = $new_diff;
            }
        }
    }
    elseif(!isset($array2[$key]) || $array2[$key] != $value)
    {
        $difference[$key] = $value;
    }
}

【讨论】:

    【解决方案6】:

    此功能将为您完成所有工作。

    您可以使用它来真正比较任何2个相同或完全不同结构的数组

    它会返回:

    array1 中的值不在 array2 (更多)

    array2 中的值不在 array1 (less)

    array1 和 array2 中的值,但 不同 (diff)

    //results for array1 (when it is in more, it is in array1 and not in array2. same for less)
    function compare_multi_Arrays($array1, $array2){
        $result = array("more"=>array(),"less"=>array(),"diff"=>array());
        foreach($array1 as $k => $v) {
          if(is_array($v) && isset($array2[$k]) && is_array($array2[$k])){
            $sub_result = compare_multi_Arrays($v, $array2[$k]);
            //merge results
            foreach(array_keys($sub_result) as $key){
              if(!empty($sub_result[$key])){
                $result[$key] = array_merge_recursive($result[$key],array($k => $sub_result[$key]));
              }
            }
          }else{
            if(isset($array2[$k])){
              if($v !== $array2[$k]){
                $result["diff"][$k] = array("from"=>$v,"to"=>$array2[$k]);
              }
            }else{
              $result["more"][$k] = $v;
            }
          }
        }
        foreach($array2 as $k => $v) {
            if(!isset($array1[$k])){
                $result["less"][$k] = $v;
            }
        }
        return $result;
    }
    

    【讨论】:

    • 我已经测试了您的功能,并在现有键下获得了“更多”值。哟必须使用array_key_exists($k, $array2[$k]) 而不是测试isset($array2[$k]) 因为isset 测试密钥存在并且具有非空值
    • 我有一个错误类型。我必须写array_key_exists($k, $array2)
    • 我在生产中使用这个功能,从来没有遇到过问题。如果您找到改进它的方法,请告诉我。谢谢@quevedo
    • 您提到您的函数将使用“2 个相同或完全不同结构的数组”。我有两个数组,我已经尝试了我知道的每一个转换,但没有一个在你的函数中工作。它打印预期的三个数组(更多/更少/差异),但它们是空的。这是我的数组格式的部分示例:Array1 ([{"id":"100000565","position":"Cost Containment Analyst","area":"Warehouse (Domestic US)","ro":"" ,"span":"0",) 和 Array2([{"id":"100000567","position":"全球物流专家","area":"Shipping/Receiving","ro":1,"跨度":)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多