多维数组比较两个数组并更新第一个数组值

时间:2013-05-15 18:30:22

标签: php

我想用数字过滤数组并在第一个数组中更新它的状态。

我有两个数组$ 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')
);

有什么想法可以开始吗?

4 个答案:

答案 0 :(得分: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'属性上的 keyed ,那么搜索/替换操作会更容易。因此,如果这是您的数据:

$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 :(得分: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
    )

)

答案 2 :(得分: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'];
  }
}

答案 3 :(得分: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 
)