2013-10-24 72 views
1

我有兩個我想要合併的數組,但省略了第二個數組中匹配值的元素。 (idotherId合併2個數組,將第二個數組的元素留在值匹配

我知道如何用第一個循環內的第二個循環來實現這一點,但我想知道是否可以使用單個循環或使用特定的PHP函數來實現?

這是什麼,我現在在做一個例子:

foreach ($array1 as $item) 
{ 
    $id = $item['id']; 

    foreach ($array2 as $key => $item) 
    { 
     if ($item['otherId'] == $id) 
     { 
      unset($array2[$key]); 
     } 
    } 
} 

$output = array_merge($array1, $array2); 

會有很多在兩個數組的元素,所以我在尋找這樣做的最有效的方式。陣列

例子:

$array1 = [ 
    [ 
     'id' => 1 
     'name' => 'item 1' 
    ], 
    [ 
     'id' => 2 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 3 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 4 
     'name' => 'item 4' 
    ] 
]; 

$array2 = [ 
    [ 
     'id' => 1, 
     'otherId' => 2, 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 2, 
     'otherId' => 3, 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ] 
]; 


$output = [ 
    [ 
     'id' => 1 
     'name' => 'item 1' 
    ], 
    [ 
     'id' => 2 
     'name' => 'item 2' 
    ], 
    [ 
     'id' => 3 
     'name' => 'item 3' 
    ], 
    [ 
     'id' => 4 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ], 
    [ 
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ] 
]; 
+0

_「所以我正在尋找這樣做的最有效的方法」_ - 那麼請告訴我們你已經找到/開發和嘗試了哪些方法。 – CBroe

+0

@CBroe循環內有一個循環,並檢查這些值是否匹配。但我想避免使用嵌套循環。我會用這個例子更新我的問題。 – jlmmns

+0

你可以發佈你的原始代碼,合併 – gwillie

回答

2

你是指這樣的:

<?php 

$array1 = array(
    array(
     'id' => 1, 
     'name' => 'item 1' 
    ), 
    array(
     'id' => 2, 
     'name' => 'item 2' 
    ), 
    array(
     'id' => 3, 
     'name' => 'item 3' 
    ), 
    array(
     'id' => 4, 
     'name' => 'item 4' 
    ) 
); 

$array2 = array(
    array(
     'id' => 1, 
     'otherId' => 2, 
     'name' => 'item 2' 
    ), 
    array(
     'id' => 2, 
     'otherId' => 3, 
     'name' => 'item 3' 
    ), 
    array(
     'id' => 3, 
     'otherId' => null, 
     'name' => 'item 4' 
    ), 
    array(
     'id' => 4, 
     'otherId' => null, 
     'name' => 'item 5' 
    ) 
); 

$output = $array1; 
for($i=0,$c=sizeof($array2);$i<$c;$i++){ 
    if(is_null($array2[$i]['otherId'])) 
     array_push($output, $array2[$i]); 
} 

var_dump($output); 

活生生的例子see here

,你也可以做array_push()直接放入$陣列1,以減少內存使用。例如here

+0

這兩個數組中的項目的順序和數量是不一樣的,所以這不起作用,我想? – jlmmns

+0

是的,這隻會與otherId == null一起使用。 我看到您剛剛添加的代碼。這不會起作用。 – dododo

+0

啊,起初我沒有看到'$ c = sizeof($ array2)'!我馬上試試這個! – jlmmns

0

這個怎麼樣功能:

function searchForId($id, $array) { 
foreach ($array as $key => $val) { 
    if ($val['uid'] === $id) { 
     return $key; 
    } 
    } 
    return null; 
} 

你可以用它來搜索陣列。 爲了避免混淆,我只是將其粘貼,以便於查看解決方案。完整的解決方案可以在https://stackoverflow.com/a/6661561/1238227感謝@Jakub Truneček

+0

乾淨,但這仍然是一個嵌套的循環。 – jlmmns

+0

這是事實...但這是我找到的最好的方式... –

+0

是的,在主循環中使用它仍然很不錯。更少的混亂代碼。 – jlmmns

相關問題