2015-06-27 38 views
0

我有2列:2數組:僅保留元素具有不同的價值

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [fieldname] => banana 
      [value] => yellow 
     ) 
) 

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [fieldname] => rome 
      [value] => city 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [fieldname] => bla 
      [value] => yes 
     ) 
) 

我想創建一個只包含元素,其中「ID」是不同的一個新的數組。換句話說,我希望得到如下的輸出:

Array 
(
    [0] => Array 
     (
      [id] => 2 
      [fieldname] => bla 
      [value] => yes 
     ) 

) 

[ID] => 2是唯一的不同[ID]所以我把它。

說我已經設法達到我的目標,如果聲明和臨時變量的foreach效率低下。我真的不想爲這個非常小的東西使用代碼牆,所以我開始尋找一個原生的PHP函數,但沒有成功。獲得結果的最簡單方法是什麼?是否有可能我嚴格需要使用如此多的foreach?

+0

當你說不同,你說的是所有的值是唯一的或唯一的ID ?你想刪除重複的元素,包括原始和重複嗎? –

+0

處理它的經典方法是使用array-search http://php.net/manual/en/function.array-search.php – Proxytype

回答

0

您可以使用array_udiff功能。

通過使用 數據比較的回調函數來計算數組的差異。

返回一個數組,其中包含第一個數組的所有值,而不是其他任何參數中存在的 。


代碼:

// Setup two arrays as per your question 
$array1 = array (

    '0' => array (
    'id' => '1', 
    'fieldname' => 'banana', 
    'value' => 'yellow', 
) 

); 

$array2 = array (

    '0' => array (
    'id' => '1', 
    'fieldname' => 'rome', 
    'value' => 'city', 
), 

    '1' => array (
    'id' => '2', 
    'fieldname' => 'bla', 
    'value' => 'yes', 
) 

); 

// Setup the callback comparison function 
function arrayCompare($array2, $array1) { 
    return $array2['id'] - $array1['id']; 
} 

// Use array_udiff() with the two arrays and the callback function 
$arrayDiff = array_udiff($array2, $array1, 'arrayCompare'); 
print_r($arrayDiff); 

上面的代碼返回如下:

Array (

    [1] => Array (
    [id] => 2 
    [fieldname] => bla 
    [value] => yes 
) 

) 
+1

Damin它真實!回調就是這樣。謝謝。 – user1274113

0

這應該這樣做。不是超短的,它確實使用了一個臨時變量,所以也許不是你想要的。我已經命名了兩個陣列onetwo

$ids = array(); 
$result = array(); 

foreach ($one as $x) { 
    $ids[$x['id']] = 1; //This way, isset($x['id']) vill return true 
} 

foreach ($two as $x) { 
    if (!isset($ids[$x['id']])) { 
     $result[] = $x; 
    } 
} 

如果沒有更緊湊的方法去做,我會感到驚訝。

編輯:這是一個替代變種,每個變種都有嵌套。不是特別短。

$result = array(); 

foreach ($one as $x) { 
    foreach ($two as $y) { 
     if ($x['id'] == $y['id']) { 
      //A match, lets try the next $x 
      continue 2; 
     } 
    } 
    //No matching id in $two 
    $result[] = $x; 
}