我有两个对象数组。
第一个数组$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
(如果$x
中有100个项目,$y
中有100个项目},它循环100 * 100次)。我认为有一种更高效,更优雅或更优化的方式来做到这一点,但我不知道该怎么做(我没有找到对这个具体问题的精确回答,所以我在这里问。)
答案 0 :(得分: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);
}
?>