尝试更新阵列时的错误

时间:2018-06-29 13:43:30

标签: php arrays symfony

我对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。

谢谢你们:)

2 个答案:

答案 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']);
            }
        }
    }
}