對於這樣的專門陣列修改,選擇的方法是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'];
}
}
你是如何獲取這些數據?因爲如果你有有意義的鍵,而不必檢查'number'部分,它會變得簡單得多... – Wrikken
根據第二個數組中的數字更新第一個數組的名稱部分。 –
這不是我要問的。我問我們是否可以在源頭上簡化這個問題,而不是稍後再做一些冗餘循環。 – Wrikken