根据我上一次question,如何将以下2个数组与array_intersect()
进行比较?我想将第一个数组的值与第二个数组的内部数组的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),
我目前的解决方法是仅使用内部数组的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条记录,因此会占用大量内存和电量。克隆时的资源。有没有更好的解决方案?
答案 0 :(得分: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']]);
});