【问题标题】:PHP : advanced array_intersect()PHP:高级 array_intersect()
【发布时间】:2013-03-12 10:33:09
【问题描述】:

根据我的最后一个 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 条记录,因此在克隆时会消耗大量内存和资源。有没有更好的解决方案?

【问题讨论】:

    标签: php array-intersect


    【解决方案1】:

    您应该翻转$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']]);
    });
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多