假设我有一个像这样的对象数组:
Array
(
[0] => stdClass Object
(
[id] => 10-423-1176
[qty] => 2
[price] => 12.6
)
[1] => stdClass Object
(
[id] => 26-295-1006
[qty] => 24
[price] => 230.35
)
[2] => stdClass Object
(
[id] => 12-330-1000
[qty] => 2
[price] => 230.35
)
我还有另一个对象帽子阵列如下:
Array
(
[0] => Item Object
(
[internalId] => 14062
[itemVendorCode] => 89-605-1250
)
[1] => Item Object
(
[internalId] => 33806
[itemVendorCode] => 89-575-2354
)
[2] => Item Object
(
[internalId] => 64126
[itemVendorCode] => 26-295-1006
)
)
我想循环遍历第二个对象数组并获取&item项目编号'然后将其用作' id'从第一个对象数组中获取对象。有没有办法在不循环第一个数组的情况下获得我想要的东西?在我的用例中,循环是非常昂贵的。
提前致谢。
答案 0 :(得分:2)
您需要第一个数组索引键吗?如果没有,你可以迭代第一个数组并将键设置为id
。类似的东西:
foreach ($items as $key => $item) {
$items[$item->id] = $item;
unset($items[$key]);
}
答案 1 :(得分:2)
在任何情况下都必须使用循环,即使这些循环隐藏在PHP内置函数中。
例如:
$codes = array_map(function ($item) { return $item->itemVendorCode; }, $array2);
$items = array_filter($array1, function ($item) use ($codes) { return in_array($item->id, $codes); });
// $items contains only elements from $array1 that match on $array2
如果这比使用常规循环更有效,很难说。
由于您正在尝试编写应该是DBMS的工作,我建议您将这些表导出到MySQL等数据库服务器,并让它在那些“JOIN”上发挥作用。
回答你的评论,你可以合并这样的东西:
$result = array();
foreach ($array1 as $item1)
foreach ($array2 as $item2)
if ($item1->id == $item2->itemVendorCode)
$result[] = (object)array_merge((array)$item1, (array)$item2));
$result
将包含一组新对象,这些对象合并来自$array1
的{{1}}和$array2
的属性。
答案 2 :(得分:1)
尝试使用array_search: http://php.net/manual/en/function.array-search.php
foreach($array2 as $key=>$item) {
$firstArrayObjectKey = array_search($item['itemVendorCode'], $array1);
//... do something with the key $firstArrayObjectKey
}
答案 3 :(得分:1)
您可以使用array_map
和array_filter()
功能来实现这一目标。
尝试使用此代码:
<?php
$first = array();
$first[0] = new stdClass;
$first[0]->id = '89-605-1250';
$first[0]->qty = 2;
$first[0]->price = 12.6;
$first[1] = new stdClass;
$first[1]->id = '89-575-2354';
$first[1]->qty = 24;
$first[1]->price = 230.35;
$last = array();
$last[0] = new stdClass;
$last[0]->internalId = 14062;
$last[0]->itemVendorCode = '89-605-1250';
$last[1] = new stdClass;
$last[1]->internalId = 33806;
$last[1]->itemVendorCode = '89-575-2354';
$ids = array_map(function($element){return $element->itemVendorCode;}, $last);
$to_find = $ids[0];
$object = array_filter($first, function($element){global $to_find; return $element->id == $to_find ? true: false;})[0];
print_r($object);
?>
输出:
stdClass Object
(
[id] => 89-605-1250
[qty] => 2
[price] => 12.6
)
答案 4 :(得分:1)
这是解决这个问题的另一种直接方法,甚至比我之前提出的方法更好:
// you got the $itemVendorCode from looping through the second array, let say :
$itemVendorCode = "89-605-1250";
// I'm assuming that you converted the array of objects in into accessible multidimensional array
// so the $first_array would look like :
$first_array= array (
array (
"id" => "10-423-1176",
"qty" => 2,
"price" => 12.6
),
array (
"id" => "10-423-1176",
"qty" => 5,
"price" => 25
),
array (
"id" => "89-605-1250",
"qty" => 12,
"price" => 30
)
);
// Now you can filter the first array using
$filter = function ($player) use($itemVendorCode) {
return $player ['id'] == $itemVendorCode;
};
$filtered = array_filter ( $first_array, $filter );
// print the price of the matching filtered item
print $filtered[key($filtered)]['price'] ;
答案 5 :(得分:0)
在这种情况下,您需要遍历第一个数组以获取itemVendorCode。
在此之后,您可以使用上一个过程中的itemValue,使用array_reduce函数搜索第一个对象的简化数组: