我对symfony的项目有两个疑问。
我的第一个: 我正在尝试修改数组中的某些数据。 我有此代码
var_dump($results); // FIRST ONE
foreach ($results as $result) {
foreach ($result as $res) {
foreach ($dates as $date) {
if(!array_key_exists($date,$res)) {
$res = array_merge($res,[$date => '0']);
}
}
var_dump($res); // THIS ONE IS MODIFIED
}
}
var_dump($results); // LAST ONE... SAME AS THE FIRST ONE
我不明白为什么我的数组'$ results'没有更新……我错过了什么吗?
第二个问题是:有什么方法可以简化此代码?我不喜欢3个foreach。
谢谢你们:)
答案 0 :(得分:2)
PHP foreach在迭代时复制每个项目,因此当您更改$ res项目时,$ result数组将不会更新。
1)您可以使用数组键更改主数组
foreach($arrr as $k => $item) {arrr[$k]['key'] = 'changed'}
2)或者您可以链接到$ res项目并直接更改
foreach($arrr as &$item) {$item['key'] = 'changed'}
请注意,第二种情况可能会导致不同的问题
答案 1 :(得分:1)
除非您使用PHP传递对象,否则PHP不会通过引用传递值。 $ res是值的副本,而不是原始值的链接。如果您知道自己在做什么,则可以参考引用。通过引用传递时,更改$ res将更改原始数据。您可以通过在变量或参数前加上&
作为前缀来进行引用。
由于这是一个嵌套的foreach,因此您还必须通过引用传递$ result,以避免成为$ results项的副本。
foreach ($results as &$result) {
foreach ($result as &$res) {
foreach ($dates as $date) {
if(!array_key_exists($date,$res)) {
$res = array_merge($res,[$date => '0']);
}
}
}
}