比较两个数组保存数据到匹配

时间:2012-03-05 01:21:36

标签: php

我需要比较两个数组......

$ Drink Array

(
[0] => Drink Object
    (
        [top_id] => 40C6-88
        [name] => Pepsi
        [drink_id] => E936
    )

[1] => Drink Object
    (
        [top_id] => 46DB-9E
        [name] => Orange Juice
        [drink_id] => E936
    )
)

[2] => Drink Object
    (
        [top_id] => 5J71-4F79
        [name] => Dr Pepper     
        [drink_id] => E936
    )

$ DrinkItem数组

(
[0] => DrinkItem Object
    (
        [bottom_id] => 45BD-92DD
        [name] => Diet Coke      
        [drink_template_id] => 3B2A-4D82
    )

[1] => DrinkItem Object
    (
        [bottom_id] => 4A71-8F79
        [name] => Orange Juice     
        [drink_template_id] => 3B2A-4D82
    )


)

..如果名称与DrinkItem数组中的某个名称匹配,我需要存储该项目的top_id。

我试图做类似的事情:

foreach ($Drink as $d) {
    foreach ($DrinkItem as $item){
        if ($d->name == $item->name){
            $match = $d->top_id;
        }
    }
}

但我可能会离开这里。如果有更好的方法来存储比赛的ID,或者如果我在正确的轨道上,我们非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

首先创建索引可能会更好:

$drinkindex = array();

// Note that names need to be unique.
foreach ($Drink as $d) {
    $drinkindex[$d->name] = $d->top_id;
}

$matches = array();
foreach ($DrinkItem as $di) {
    $match = $drinkindex[$di->name];
    if ($match!==NULL) {
        $matches[$match] = True;
    }
}

// $matches is a set of top_id.
// If you may have duplicates and you want those represented, use a list instead.

如果您需要整个Drink对象而不仅仅是top_id,请考虑使用数组交集,如下所示:

function namecompare($a, $b) {
    if ($a->name === $b->name) {
        return 0;
    } else {
        return ($a->name < $b->name) ? -1: 1;
    }
}

$intersection = array_uintersect($Drink, $Drinkitem, 'namecompare');

var_dump($intersection); // contains $Drink[1];

答案 1 :(得分:1)

您的方法显然是O(n*m)

nm表示数组$Drink$DrinkItem的长度。

您可以在O(n + m)时间内解决问题,假设您可以访问具有分摊O(1)插入/获取性能的基于哈希的映射。

  1. 初始化空地图和空列表。
  2. 遍历$Drink数组,并使用name作为关键字将每个对象存储在地图中。
  3. 遍历$DrinkItem和每个$drink_item,检查$drink_item->name是否映射到地图中的Drink对象。
    • 如果是,请将映射的Drink对象的top_id添加到列表中。
  4. 该列表包含top_id,您已在O(n+m)时间内获得这些内容。

    编辑:Francis Avila的帖子包含实际完成此操作的PHP代码。