2013-05-15 1 views
0

Я хочу фильтровать массив по номеру и обновлять его статус в первом массиве.Multidimenssion array сравнивает два массива и обновляет значение первого массива

Я два массива $ 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); 

ВЫВОД:

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); 

ВЫВОД:

Array ( 
    [b] => 100 
    [c] => 200 
) 
Смежные вопросы