1

我有两个数组,我需要找出两者之间的差异并将它们显示在无序列表中。

我可以循环遍历主数组以进行单个匹配,但我不知道如何遍历主列表以获取多个键值并有效地执行此操作。

下面是每个数组的关键值的摘录:

要搜索的主阵列

foreach ( $levels as $level ) {
  $output .= '<li>' . $level['name'] . '</li>';

包含可能匹配的数组

foreach ( $login_member_levels as $level ) {
  $output .= '<li>' . $level_array[]=$level->level . '</li>';

为多维问题添加了信息...

这是我需要比较的两个多维数组,但子数组不匹配:

我需要在第一个数组 [levels][level_id] 和 [levels][level][id] 中进行比较

Array
(
  [success] => 1
  [member] => Array
    (
      [0] => Array
        (
          [ID] => 2
          [UserInfo] => Array
              (
                 [ID] => 2
                 [caps] => Array
                      (
                          [administrator] => 1
                      )
              )
          [Sequential] => 
          [Levels] => Array
            (
                [1347037874] => stdClass Object
                    (
                       [Level_ID] => 1347037874
                       [Name] => HFM-Cardiac Resistance Training Program
                       [Cancelled] => 
                    )

                [1347037875] => stdClass Object
                   (
                       [Level_ID] => 1347037875
                       [Name] => HFM-Official Heart Health Guide
                       [Cancelled] => 
                       [1347037876] => stdClass Object
                       (
                             [Level_ID] => 1347037876
                             [Name] => HFM-All Access Cardiac Success Club
                         [Cancelled] => 
                            )
                    )
        )
    )   

这是第二个数组:

Array
(
    [success] => 1
    [levels] => Array
        (
            [level] => Array
                (
                    [0] => Array
                        (
                            [id] => 1347037871
                            [name] => HFM-Ask the Experts
                            [_more_] => /levels/1347037871
                        )
                    [1] => Array
                        (
                            [id] => 1347037874
                            [name] => HFM-Cardiac Resistance Training Program
                            [_more_] => /levels/1347037874
                        )
                    [2] => Array
                        (
                            [id] => 1347037875
                            [name] => HFM-Official Heart Health Guide
                            [_more_] => /levels/1347037875
                        )
                    [3] => Array
                        (
                            [id] => 1347037876
                            [name] => HFM-All Access Cardiac Success Club
                            [_more_] => /levels/1347037876
                        )
                )
        )
   [supported_verbs] => Array
        (
           [0] => GET
           [1] => POST
        )
)
4

2 回答 2

2

请注意,正如Jod正确建议的那样,array_diff 函数会将 array1array2 进行比较并返回差异。
例子:

$array1 = array("green", "red", "blue", "red");
$array2 = array("green", "yellow", "brown");
$result = array_diff($array1, $array2);

var_dump($array1);
var_dump($array2);
var_dump($result);

会给你:

// Array1
array(4) {
  [0] => "green"
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

// Array2
array(3) {
  [0] => "green"
  [1] => "yellow"
  [2] => "brown"
}

// array_diff result
array(3) {
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

因为这些值存在于array1 但不在array2·

如果您有兴趣获取一个包含两个(或多个)数组之间的所有差异(作为值)的数组,我为此编写了一个函数:

function array_diff_all()
{
    $arguments = func_get_args();

    $merged         = array();    
    $intersected    = $arguments[0];
    for ($i = 0; $i < count($arguments); $i++)
    {
        $merged         = array_merge($merged, $arguments[$i]);
        $intersected    = array_intersect($intersected, $arguments[$i]);
    }

    return array_values(array_filter( array_unique(array_diff($merged, $intersected)) ));
}

用法示例:(同上)

$array1 = array("green", "red", "blue", "red");
$array2 = array("green", "yellow", "brown");
$result = array_diff_all($array1, $array2);

var_dump($array1);
var_dump($array2);
var_dump($result);

会给你

// Array1
array(4) {
  [0] => "green"
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

// Array2
array(3) {
  [0] => "green"
  [1] => "yellow"
  [2] => "brown"
}

// array_diff_all result
array(4) {
  [0] => "red"
  [1] => "blue"
  [2] => "yellow"
  [3] => "brown"
}

请注意:
1)它仅适用于索引数组,如果您使用散列(关联数组),它仅在键是唯一的情况下才能正常工作。
2) 结果数组被重新索引,这意味着与原始值相比,值可以具有不同的索引。
3) 删除重复值并返回唯一的结果数组。
4)您可以一次比较多个数组。
例子:

$first  = array('foo', 'moo', 'zoo');
$second = array('foo', 'done', 'gone');
$third  = array('foo', 'mix', 'zoo');

var_dump( array_diff_all($first, $second, $third) );

将输出:

array(5) {
  [0] => "moo"
  [1] => "zoo"
  [2] => "done"
  [3] => "gone"
  [4] => "mix"
}

编辑:
对于您问题的第二部分:
您不能将上述方法用于您的具体情况,因为您有两个完全不同的数组要比较,而且第一个包含对象。
要解决您的问题,您需要:
A)了解如何访问第一个数组的“级别”数组。在我看来,您必须遍历 $array1['member'],我猜它们每个都有一个 'levels' 数组。
它可以是这样的:

foreach ($array1['member'] as $member)
{
    $levels = $member['levels'];
    ...
}

此时 $levels 应该是一个对象数组,如:

[Levels] => Array
    (
        [1347037874] => stdClass Object
            (
        [Level_ID] => 1347037874
        [Name] => HFM-Cardiac Resistance Training Program
        [Cancelled] => 
    )

    [1347037875] => stdClass Object
    (
                [Level_ID] => 1347037875
        [Name] => HFM-Official Heart Health Guide
        [Cancelled] => 
            )

    [1347037876] => stdClass Object
    (
        [Level_ID] => 1347037876
            [Name] => HFM-All Access Cardiac Success Club
        [Cancelled] => 
            )
    )

B)这个想法是要注意你需要比较的level_id是这个'levels'数组的键,而array2是一个'普通'多维数组(我的意思是不包含对象)......所以我们可以安全地使用内置 -在 php 的数组函数中。
我们可以假设 level_id 足够复杂以至于在 $array2 中是唯一的,所以我们只能检查某个 level_id 是否存在$array2 中(递归地)作为一个值,而不关心比较其中的 'id' 键。

为此,您需要:
C)我编写的递归 in_array 函数:

function in_array_recursive($needle, $haystack)
{ 

    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack)); 

    foreach ($it AS $element)
        if ($element === $needle)
            return true; 

    return false; 
}


D)创建一个助手用作array_filter的回调函数

function array_diff_helper($var)
{
    global $array2;
    return !(in_array_recursive(trim($var), $array2));
}

请注意,如果不同,请在此处使用第二个数组的名称。
E)最后你可以得到level_ids的差异:

$diff = array_filter(array_keys($levels), "array_diff_helper");



所以..你需要的循环可能很简单

foreach ($array1['member'] as $member)
{
    $not_matching_ids = array_filter(array_keys($member['levels']), "array_diff_helper");
}

希望这会有所帮助,干杯!:)

于 2012-10-23T21:33:15.173 回答
1

用于array_diff()生成不匹配值的数组。

http://php.net/manual/en/function.array-diff.php

于 2012-10-23T20:28:40.950 回答