【问题标题】:Comparing arrays not printing the differences比较数组不打印差异
【发布时间】:2017-02-10 18:41:57
【问题描述】:

这是我的测试代码:

$a = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"21");

$b = array("Peter"=>"35", "Ben"=>"21", "Joe"=>"43");

function leo_array_diff($a, $b) {
    $map = array();
    foreach($a as $val) $map[$val] = 1;
    foreach($b as $val) unset($map[$val]);
    return array_keys($map);
}

print_r(leo_array_diff($a, $b));

echo "<br>";

print_r(array_diff($a, $b));

这是打印出来的:

Array ( [0] => 37 ) 
Array ( [Ben] => 37 )

我将指代leo_array_diff() 函数:

第一个问题:

如您所见,peter 是同一个数字,这很好。 $aben 和 $bben 是不同的。 $a$b 乔是不同的。但它只是表明本是不同的。

也许是因为$a joe 21 与$b ben 是21 相同?我该如何改变呢? peter需要和peter对应,ben需要和ben对应,等等……

第二个问题:

Ben 不同,是的,因为 37 和 21 但在 print_r 中,它只显示 Array ( [0] =&gt; 37 )。我怎样才能让它显示Array ( [0] =&gt; 21 )?调用函数时如何编辑函数而不交换参数?

【问题讨论】:

  • 1) 看看array_diff_assoc() 2) 阅读有关array_diff_assoc() 的文档 参数的顺序很重要!
  • @Rizier123 哇,这适用于第二行。使用函数leo_array_diff() 的第一行呢?

标签: php arrays sorting


【解决方案1】:

首先,你对array_diff有一个误解。

返回一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目。

它没有返回索引Joe,因为值21 在第一个数组中。

现在,为什么您的功能不起作用?好吧,让我们一步一步来。

这是您的地图在第一次 foreach 后的样子:

array(
    '35' => '1',
    '37' => '1',
    '21' => '1'
)

然后,在您的第二次 foreach 中,您将遍历数组并删除值匹配的键。所以基本上,您要删除索引35 和索引21,这就是为什么只保留索引37 的原因。 这里真正的问题是因为您没有在任何地方检查名称

这是您的功能的替代方案:

function leo_array_diff($a, $b) {

    $map = array();

    foreach($a as $name => $value){

        // The name is not found in the second array
        // Or the value is different from the first array
        if(!isset($b[$name]) || $b[$name] != $value)
            $map[$value] = 1;

    }

    return array_keys($map);

}

var_dump 将是:

array(2) {
    [0]=>
        int(37)
    [1]=>
        int(21)
}

【讨论】:

  • 哇,你真是个天才!好的,我怎样才能从第二个数组返回值?例如:现在有了你的功能,我得到了这个:Array ( [0] =&gt; 37 [1] =&gt; 21 ) 。现在,我得到值 37 和 21,因为它们是不同的。如何从数组 2 中获取值?在这种情况下是 21 和 43?
  • @jasonmoqio 正如我在您的问题上方的评论中已经说过的那样:您的论点的顺序很重要!
  • @jasonmoqio 如果你想反过来,你必须像 rizier 所说的那样颠倒参数的顺序。但是,如果您愿意,我可以更改函数以在子数组中返回两者。
【解决方案2】:

交换$a和$b

print_r(leo_array_diff($b,$a));

只需交换数组...第一个参数用于显示差异的位置,因此使用该数组的值。

【讨论】:

  • 是的,我知道。请参阅编辑。调用函数时如何编辑函数而不交换参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2019-08-03
  • 2019-06-24
  • 1970-01-01
  • 2014-11-01
  • 2012-10-18
  • 2013-06-17
相关资源
最近更新 更多