比较不打印差异的数组

时间:2017-02-10 18:41:58

标签: php arrays sorting

这是我的测试代码:

$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()功能:

第一个问题:

正如你所看到的,彼得是一个相同的数字,所以这很好。 $a ben和$b ben不同。 $a$b乔是不同的。但它只显示本不同。

可能因为$a乔21与$b相同,本是21?我怎么能改变呢? peter需要与peter相对应,ben需要与ben等对应...

第二个问题:

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

2 个答案:

答案 0 :(得分:2)

首先,您对array_diff有误解。

  

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

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

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

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

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

答案 1 :(得分:0)

兑换$ a和$ b

的print_r(leo_array_diff($ B $ A));

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