0

配列を数値でフィルタリングし、最初の配列でそのステータスを更新したいと考えています。

私は2つの配列$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)。最初の配列の要素数に 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
];

次に、2 番目の配列をループして数値を取得し、それが $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 に答える