3

我有两个对象数组。

第一个数组$x

[0] => stdClass Object
    (
        [id] => 54
        [value] => test54
        [something] => testtest54
    )

[1] => stdClass Object
    (
        [id] => 21
        [value] => test21
        [something] => testtest21
    )
...

第二个数组$y

[0] => stdClass Object
    (
        [id] => 21
        [value] => test21_new_value
    )

[1] => stdClass Object
    (
        [id] => 54
        [value] => test54_new_value
    )
...

我想更新我的第一个数组$x导入value第二个数组的 ( $y) 字段,它具有相同的id,我想要:

[0] => stdClass Object
    (
        [id] => 54
        [value] => test54_new_value
        [something] => testtest54
    )

[1] => stdClass Object
    (
        [id] => 21
        [value] => test21_new_value
        [something] => testtest21
    )
...

我可以做这样的事情:

foreach($x as $k => $v) {
    foreach($y as $k2 => $v2) {
        if ($v->id === $v2->id) $x[$k]->value = $v2->value;
    }
}

但我不喜欢这样,因为我必须$y为每个数组行走$x(如果我有 100 个项目$x和 100 个项目$y,它会循环 100*100 次)。我认为有一种更高效、更优雅或更优化的方法可以做到这一点,但我不知道该怎么做(我没有找到对这个具体问题的准确回应,所以我在这里问)。

4

1 回答 1

2

当然。通常您会为此使用关联数组(键是唯一 ID),因为这意味着 (100 + 100) 次迭代而不是 (100 * 100):

<?php
    $assocX = array();
    foreach ($x as $v) {
        $assocX[$v->id] = $v;
    }

    foreach ($y as $v) {
        $v->something = $assocX[$v->id]->something;
    }
?>

如果您不能确定该值是否存在,$x您也可以检查这一点(“无值”将被翻译为NULL):

<?php
    $assocX = array();
    foreach ($x as $v) {
        $assocX[$v->id] = $v;
    }

    foreach ($y as $v) {
        $v->something = (isset($assocX[$v->id]) ? $assocX[$v->id]->something : null);
    }
?>
于 2013-10-29T16:07:17.293 回答