2010-03-12 76 views
1

试图了解今天的PHP数组。php获取数组中的'新'值

我有一组阵列是这样的:

$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
) 
$b = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Canada',), 
) 

我需要“新”子阵列是数组b带来的表。

即,我需要返回array ('value' => 'Canada',)

我以为我可以首先合并$ A + $ B,然后比较结果给美元。

$merge = array_merge($a,$b); 
$result = array_diff($merge,$a); 

但不知何故,这是行不通的。它返回array()

怎么回事?谢谢!

回答

2

这应该做的伎俩:

$new = array(); 
foreach($b as $elem){ 
    if(!in_array($elem, $a)){ 
     $new[] = $elem; 
    } 
} 

返回加拿大。

+1

谢谢菲利克斯。 :) – Mark 2010-03-13 12:37:56

+0

不客气! – middus 2010-03-13 13:06:17

0

如果我运行你的代码,直到array_merge($a, $b),做一个var_dump($merge),我得到这个:

array(6) { 
    [0]=> 
    array(1) { 
    ["value"]=> 
    string(7) "America" 
    } 
    [1]=> 
    array(1) { 
    ["value"]=> 
    string(7) "England" 
    } 
    [2]=> 
    array(1) { 
    ["value"]=> 
    string(9) "Australia" 
    } 
    [3]=> 
    array(1) { 
    ["value"]=> 
    string(7) "America" 
    } 
    [4]=> 
    array(1) { 
    ["value"]=> 
    string(7) "England" 
    } 
    [5]=> 
    array(1) { 
    ["value"]=> 
    string(6) "Canada" 
    } 
} 

那不是,你脑子里的东西。

-

此外,在php.net array_diff's文件上写着:

Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same. 
Note: This function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);. 
+0

我也是这么认为的,但是后来我需要区别它们,然后它不起作用。 – Mark 2010-03-12 22:39:54

+0

谢谢,那么它看起来像array_diff将无法正常工作。什么是替代方案? – Mark 2010-03-12 22:47:08

+0

@Mark看到我的其他答案:http://stackoverflow.com/questions/2436322/php-getting-the-new-values-in-an-array/2436394#2436394 – middus 2010-03-12 22:49:39

0

我不是百分之百的肯定对你的要求。如果你想在函数中返回数组$ b的加拿大部分,你可以使用 return $b[2]。 这将返回一个包含value => Canada的数组。如果你想显示数组的内容,你可以像这样使用var_dump函数。

var_dump($VaribleToDisplay); 

var_dump也可以用于其他变量类型。

0

由于你的数组包含通过公共键索引的子数组,所以你不能使用array_merge,array_diff等,因为那些处理由键索引的数组(无子数组)。

你可以使用array_walk来做你想做的事情,但会花费更多的代码。考虑类似于:

$newVals = array(); 

function walker($sub, $key, $otherArray) 
{ 
    $found = false; 
    foreach($otherArray as $idx => $sub2) 
    { 
     if ($sub['value'] == $sub2['value']) 
     { 
      $found = true; 
      break; 
     } 
    } 
    if (!$found) 
     $newVals[] = $sub; 
} 

array_walk($a, 'walker', $b); 

这并不是特别快。如果你可以改变你的输入数据直接在数组中使用key =>值(而不是子数组),那么array_diff和array_merge将会工作,并且会更快。

即你真的想重组这样的数据:

$a = array('America', 'Australia', 'Canada'); 

或类似的东西。

0

你为什么要设置你的数组就像这是一个选择或什么?

$a = array('countries'=> array('America', 'England', 'Australia')); 
$b = array('countries'=> array('America', 'England', 'Canada')); 
array_diff($b['countries'], $a['countries']);