3

似乎我读到的每个用于比较数组( , 等)的 PHP 函数都会比较array_diff()数组array_intersect()元素的存在

给定两个具有相同结构的多维数组,您将如何列出的差异?

例子

阵列 1

[用户 1] => 数组([公共] => 1
                [私人] => 1
                [秘密] => 1
               )
[用户2] => 数组([公共] => 1
                [私人] => 0
                [秘密] => 0
               )

阵列 2

[用户 1] => 数组([公共] => 1
                [私人] => 0
                [秘密] => 1
               )
[用户2] => 数组([公共] => 1
                [私人] => 0
                [秘密] => 0
               )

区别

[用户 1] => 数组([公共] => 1
                [private] => 0 //这个值不同
                [秘密] => 1
               )

所以我的结果是——“在所有用户中,User1 发生了变化,不同之处在于 private 是 0 而不是 1。”

4

4 回答 4

4

一种方法是编写一个函数来做类似的事情..

function compareArray ($array1, $array2)
{
  foreach ($array1 as $key => $value)
  {
    if ($array2[$key] != $value)
    {
      return false;
    }
  }

  return true;
}

您可以轻松地扩充该函数以返回两者之间的差异数组。

编辑 - 这是一个更类似于您正在寻找的精炼版本:

function compareArray ($array1, $array2)
{
  var $differences;

  foreach ($array1 as $key => $value)
  {
    if ($array2[$key] != $value)
    {
      $differences[$key][1] = $value;
      $differences[$key][2] = $array2[$key];
    }
  }

  if (sizeof($differences) > 0)
  {
    return $differences;
  }
  else
  { 
    return true;
  }
}
于 2009-02-02T21:46:31.613 回答
1

我认为这可以满足您的需求。

使用您的示例数据,对外部数组进行循环,然后array_diff_assoc每次都在用户上使用。(注意,这假设当存在差异时,array_diff_assoc从传入的第二个数组返回值,这似乎是这样做的)。

<?php
$user1 = array("public" => 1, "private" => 1, "secret" => 1);
$user2 = array("public" => 1, "private" =>1, "secret" => 1);
$array1 = array ("user 1"=>$user1, "user 2"=>$user2);

$user1 = array("public" => 1, "private" => 0, "secret" => 1);
$user2 = array("public" => 1, "private" => 1, "secret" => 1);
$array2 = array("user 1"=>$user1, "user 2"=>$user2);

$results = array();  
foreach ( $array1 as $user => $value )
{
    $diff = array_diff_assoc( $array1[$user], $array2[$user] );
    if ($diff) {
        array_push($results,array($user=>$diff));   
        }
}


print_r($results);


?>

它返回:

Array
(
    [0] => Array
        (
            [user 1] => Array
                (
                    [private] => 1
                )
        )    
)
于 2009-02-03T17:55:51.530 回答
0

如果您正在寻找值的差异,那么array_diff_assoc. http://us2.php.net/manual/en/function.array-diff-assoc.php"> php 手册说它“返回一个数组,其中包含array1 中不存在于任何其他数组中的所有" 并给出以下示例:

在此示例中,您会看到两个数组中都存在“a”=>“green”对,因此它不在函数的输出中。与此不同,对 0 => "red" 在输出中,因为在第二个参数中,"red" 的键为 1

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

上面的示例将输出:

Array
(
    [b] => brown
    [c] => blue
    [0] => red
)

这是你要找的吗?

于 2009-02-03T02:52:15.600 回答
0

试试这个功能:

function arrayDiff($array1, $array2)
{
    if (!is_array($array1) || !is_array($array2)) {
        return false;
    }
    foreach ($array1 as $key => $val) {
        if (array_key_exists($key, $array2) && gettype($val) != "array" && $val === $array2[$key]) {
            unset($array1[$key]);
            continue;
        }
        if (is_array($val)) {
            $val = diff($val, $array2[$key]);
            if ($val !== false) {
                $array1[$key] = $val;
            }
        }
    }
    return $array1;
}

$array1 = array(
    array(
        array('foo', 'bar', 'baz'),
        0
    )
);
$array2 = array(
    array(
        array('foo', 'bar')
    )
);
var_dump(diff($array1, $array2));
于 2009-02-02T23:18:22.473 回答