2017-02-10 65 views
2

这里是我的测试代码:比较阵列不打印的差异

$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 joe 21与$b相同ben是21?我该如何改变它?彼得需要与彼得相对应,本需要与本等对应...

第二个问题:

本是不同的,是的,因为37和21,但在print_r,那只能说明Array ([0] => 37) 。我如何让它显示Array ([0] => 21)?如何在调用函数时编辑函数并不交换参数?

+3

1)看看'和array_diff_assoc()'2)阅读'和array_diff_assoc的文档() “你的论点顺序很重要! – Rizier123

+0

@ Rizier123哇,这工作的第二线。那么使用函数'leo_array_diff()'的第一行呢? – jasonmoqio

回答

2

首先,你对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) 
} 
+1

你是天才!好的,我该如何返回第二个数组的值?例如:现在有了ur函数,我得到这个:'Array([0] => 37 [1] => 21)'。现在,我得到值37和21,因为他们是不同的。我怎样才能得到数组2的值?在这种情况下21和43? – jasonmoqio

+1

@jasonmoqio再次因为我已经在你的问题我上面的评论说:**你参数的顺序是非常重要的** – Rizier123

+0

@jasonmoqio如果你想周围的其他方式,你必须扭转参数的顺序一样rizier说! 。但是,如果你想,我可以改变函数返回一个子数组。 –

0

交换$ a和$ b

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

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

+0

是的,我知道。请参阅编辑。如何在调用函数时编辑函数并不交换参数? – jasonmoqio