2013-05-15 85 views
0

我想按數字過濾數組並更新其在第一個數組中的狀態。多通態陣列比較兩個數組並更新第一個數組值

我有兩個陣列ARR1 $,$ ARR2

$arr1 = array(
    0=>array('number'=>100,name=>'john'), 
    1=>array('number'=>200,name=>'johnny') 
); 
$arr2= array(
    0=>array('number'=>300,name=>'r'), 
    1=>array('number'=>100,name=>'b'), 
    2=>array('number'=>200,name=>'c') 
); 

最終輸出應該是這樣的

$arr1 = array(
    0=>array('number'=>100,name=>'b'), 
    1=>array('number'=>200,name=>'c') 
); 

任何想法,開始請一個數組?

+0

你是如何獲取這些數據?因爲如果你有有意義的鍵,而不必檢查'number'部分,它會變得簡單得多... – Wrikken

+0

根據第二個數組中的數字更新第一個數組的名稱部分。 –

+0

這不是我要問的。我問我們是否可以在源頭上簡化這個問題,而不是稍後再做一些冗餘循環。 – Wrikken

回答

2

對於這樣的專門陣列修改,選擇的方法是array walk。它允許您將自定義函數應用於給定數組中的每個元素。

現在,由於你的數據格式,你將不得不做一個循環。 Wrikken詢問您是否可以檢索或轉換數據以提供更快的訪問。下面的算法是O(n^2):它將需要與第一個陣列中的元素乘以第二個陣列中元素的數量一樣多的循環,或者確切地說count($arr1) * count($arr2)

function updateNameFromArray($element, $key, $arr2) { 
    foreach($arr2 as $value) { 
     if($value['number'] == $element['number']) { 
      $element['name'] == $value['name']; 
      break; 
     } 
    } 
} 

array_walk($arr1, "updateNameFromArray", $arr2); 

現在,Wrikken是建議是,如果你的陣列可改爲'number'屬性鍵代替,然後查找/替換操作要容易得多。因此,如果這是你的數據,而不是:

$arr1 = array(
    100=>array('number'=>100,name=>'john'), 
    200=>array('number'=>200,name=>'johnny') 
); 
// notice the keys are 100 and 200 instead of 0,1 

$arr2= array(
    300=>array('number'=>300,name=>'r'), 
    100=>array('number'=>100,name=>'b'), 
    200=>array('number'=>200,name=>'c') 
); 
// notice the keys are 300, 100 and 200 instead of 0,1, 2 

然後,你可以在O(n)時間做到這一點,只有循環第一陣列上。

foreach($arr1 as $key => $value) { 
    if(isset($arr2[$key])) { 
     $value['number'] = $arr2[$key]['number']; 
    } 
} 
1

對於使用泛型PHP函數完成此操作並不是一個簡單的方法,因此,您可能需要創建映射數組。

我會接近這一問題的方法是創建一個循環,通過第一陣列去,並在$ ARR1位置的數值映射爲關鍵,以它的指數是給你:

$tmp1 = array(); 
foreach ($arr1 as $key => $number_name) { 
    $tmp1[$number_name['number']] = $key; 
} 

這應該給你一個數組,看起來像

$tmp1 [ 
    100 => 0, 
    200 => 1 
]; 

然後,我將通過第二陣列循環,得到的數值,如果存在爲$ TMP1的關鍵,得到了相關的值(即以$ ARR1的關鍵),並使用它來更新$ arr1中的名稱。

// Loop through $arr2 
foreach ($arr2 as $number_name) { 
    // Get the number value 
    $number = $number_name['number']; 

    // Find the $arr1 index 
    if (isset($tmp1[$number])) { 
    $arr1_key = $tmp1[$number]; 
    // Set the $arr1 name value 
    $arr1[$arr1_key]['name'] = $number_name['name']; 
    } 
} 
2

試試這個。這不是那麼幹淨,但我認爲它會起作用。

<?php 

$arr1 = array(0=>array('number'=>100,'name'=>'john'),1=>array('number'=>200,'name'=>'johnny')); 
$arr2= array(0=>array('number'=>300,'name'=>'r'),1=>array('number'=>100,'name'=>'b'),2=>array('number'=>200,'name'=>'c')); 
foreach($arr1 as $key=>$data1) 
    { 
foreach($arr2 as $key2=>$data2) 
{ 
    if($data1['number'] == $data2['number']) 
    { 
     $arr1[$key]['name'] = $arr2[$key2]['name']; 
    } 
} 

    } 
print_r($arr1); 
?> 

輸出將是:

Array 
(
[0] => Array 
    (
     [number] => 100 
     [name] => b 
    ) 

[1] => Array 
    (
     [number] => 200 
     [name] => c 
    ) 

) 
0
<?php 

//Set the arrays 

$arr1 = array(
    array('number'=>100,'name'=>'john'), 
    array('number'=>200,'name'=>'johnny') 
); 

$arr2= array(
    array('number'=>300,'name'=>'r'), 
    array('number'=>100,'name'=>'b'), 
    array('number'=>200,'name'=>'c') 
); 

// use a nested for loop to iterate and compare both arrays 

for ($i=0;$i<count($arr1);$i++): 

    for ($j=0;$j<count($arr2);$j++): 

     if ($arr2[$j]['number']==$arr1[$i]['number']) 
      $arr1[$i]['name']=$arr2[$j]['name']; 

    endfor; 

endfor; 

print_r($arr1); 

OUTPUT:

Array (
[0] => Array ([number] => 100 [name] => b) 
[1] => Array ([number] => 200 [name] => c) 
) 

話雖這麼說,你或許應該重新考慮非常辦法您的數據結構。你真的需要一個多維數組或者你可以使用一個簡單的關聯數組,像這樣:

// set the arrays 

$arr1 = array(
     'john'=>100, 
     'johnny'=>200   
    ); 

$arr2 = array(
     'r'=>300, 
     'b'=>100, 
     'c'=>200 
    ); 

// find values in arr2 common to both arrays 

$arr3 = array_intersect($arr2, $arr1); 

// change the key of arr1 to match the corresponding key in arr2 

    foreach ($arr3 as $key=>$value) { 

     $old_key = array_search($value, $arr1); 
     $arr1[$key]=$arr1[$old_key]; 
     unset($arr1[$old_key]); 

    } 


print_r($arr1); 

OUTPUT:

Array ( 
    [b] => 100 
    [c] => 200 
)