2010-03-12 80 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']);