我需要比较两个数组......
$ 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,或者如果我在正确的轨道上,我们非常感谢任何帮助!
答案 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)
。
n
和m
表示数组$Drink
和$DrinkItem
的长度。
您可以在O(n + m)时间内解决问题,假设您可以访问具有分摊O(1)
插入/获取性能的基于哈希的映射。
$Drink
数组,并使用name
作为关键字将每个对象存储在地图中。$DrinkItem
和每个$drink_item
,检查$drink_item->name
是否映射到地图中的Drink
对象。
Drink
对象的top_id
添加到列表中。该列表包含top_id
,您已在O(n+m)
时间内获得这些内容。
编辑:Francis Avila的帖子包含实际完成此操作的PHP代码。