1

私の最後の質問に基づいて、次の2つの配列をどのように比較できますarray_intersect()か?1番目の配列の値を2番目の配列の内部配列の値と比較したいと思いnameます。

// $arrayA
[0] => 'apple',
[1] => 'pineapple',
[2] => 'orange',
...
[299,999] => 'banana'

// $arrayB
[0] => array('name' => 'bamboo', 'price' => 123),
[1] => array('name' => 'banana', 'price' => 123),
[2] => array('name' => 'boy', 'price' => 123),
[3] => array('name' => 'ball', 'price' => 123),
[4] => array('name' => 'balloon', 'price' => 123),
[5] => array('name' => 'bazooka', 'price' => 123),

私の期待する結果は、次の結果を含む配列になります。

[1] => array('name' => 'banana', 'price' => 123),

私の現在の回避策は、2番目の配列を内側の配列のname値のみで複製することです。すなわち

$arrayB_clone = array();
foreach($arrayB as $inner_array) {
  $arrayB_clone[] = $inner_array['name'];
}
$result_index = array_intersect($arrayB_clone, $arrayA);
$result = array();
foreach($result_index as $idx => $v) {
  $result[] = $arrayB[$idx]; // value $v is not important now 
}
var_dump($result);

しかし、私のアレイには300,000を超えるレコードがあるため、クローン作成時に大量のメモリとリソースを消費します。より良い解決策はありますか?

4

1 に答える 1

3

$arrayAルックアップが高速になるように反転する必要があります。次に、単純に B を反復処理し、一致する結果を追加します。

$mapA = array_flip($arrayA);

$results = array();

foreach ($arrayB as $item) {
    if (isset($mapA[$item['name']])) {
        $results[] = $item;
    }
}

または:

$results = array_filter($arrayB, function($item) use ($mapA) {
    return isset($mapA[$item['name']]);
});
于 2013-03-12T10:38:10.837 に答える