如何通过 id 从对象数组中获取对象


How get a object by id from arrays of object?

假设我有一个这样的对象数组:

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
        )
)

我想遍历第二个对象数组并获取"itemVendorCode",然后将其用作"id"以从第一个对象数组中获取对象。有没有办法在不循环第一个数组的情况下获得我想要的东西?在我的用例中,循环是非常昂贵的。

在任何情况下,

您都必须使用循环,即使这些循环隐藏在 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$array2属性,这些属性在id == itemVendorCode中相交。

你需要第一个数组索引键吗? 如果没有,您可以迭代一次第一个数组并将 key 设置为 id 。像这样:

foreach ($items as $key => $item) {
    $items[$item->id] = $item;
    unset($items[$key]);
}

这是解决这个问题的另一种直接方法,甚至比我之前提出的方法更好:

// 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'] ;

您可以使用

array_maparray_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
)

尝试使用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
}

在这种情况下,您需要遍历第一个数组以获取 itemVendorCode。

之后,您可以使用从上一个过程中获得的itemValue array_reduce函数在第一个对象的简化数组中进行搜索:

http://php.net/manual/en/function.array-reduce.php