0

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

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

4 回答 4

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'];
    }
}
于 2013-05-15T18:55:25.000 回答
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
    )

)
于 2013-05-15T18:57:11.703 回答
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'];
  }
}
于 2013-05-15T18:53:17.020 回答
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 
)
于 2013-05-15T19:00:09.960 回答