Для специализированных модификаций массива, как это, метод выбора является 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