PHP:使用另一个未排序的对象数组更新对象数组值

3

I have two objects arrays.

First array $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,导入第二个数组($y)中具有相同id的字段的value,我希望得到:

[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;
    }
}

但我不喜欢这样做,因为我必须对每个$x遍历数组$y(如果$x有100项,$y也有100项,则循环100*100次)。我认为有更有效、优雅或优化的方法来解决这个问题,但我不知道如何做到这一点(我没有找到针对这个特定问题的精确答案,所以在这里提问)。

1个回答

2
当需要对大量数据进行操作时,通常会使用关联数组(associative array)来实现,其中键值对应于唯一的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);
    }
?>

好的谢谢!实际上,对于对象数组来说&是不必要的,我认为。$v已经是一个对象的引用了(我只尝试过一次循环,但也许我是错误的或者我还没有理解)。 - rap-2-h
@rap-2-h 你是正确的。对象始终按引用传递(忘记了,现在有点晚了!) :) - h2ooooooo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接