对于像这样的特殊数组修改,选择的方法是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'];
}
}