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

时间:2015-03-06 16:20:50

标签: php arrays algorithm object multidimensional-array

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

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'从第一个对象数组中获取对象。有没有办法在不循环第一个数组的情况下获得我想要的东西?在我的用例中,循环是非常昂贵的。

提前致谢。

6 个答案:

答案 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_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
)

答案 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函数搜索第一个对象的简化数组:

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