【问题标题】:For each array modification [duplicate]对于每个数组修改[重复]
【发布时间】:2012-12-14 11:42:21
【问题描述】:

我有以下代码:

foreach ($animals as $animal) {
    $animal = getOffSpring($animal);
}

既然我将 $animal 设置为一个新字符串,我是否也要修改数组?

我的运行表明我的数组保持不变,但我希望使用新值对其进行修改。这是bug吗?

换句话说,我希望我的数组中的所有动物都被修改为它们的后代

【问题讨论】:

  • 没有。你必须用它所在的索引重写数组中的值。
  • array_map('getOffSpring', $animals) 会做的事情

标签: php arrays


【解决方案1】:

我认为您正在尝试这样做。
当您获取$animal 变量并将其传递给函数或在foreach 循环内修改它时,您将使用独立变量,它不会以任何方式链接到$animals 数组(如果您自己不链接它),因此对其应用的所有更改都不会导致修改 $animals 数组。

foreach ( $animals as $i => $animal )
{
    $animals[ $i ] = getOffSpring( $animal );
}

正如@AlecTMH 在他的评论中提到的,array_map 也是一个解决方案。

array_map( 'getOffSpring', $animals );

【讨论】:

    【解决方案2】:

    您可以使用参考:

    foreach ($animals as &$animal) {
        $animal = getOffSpring($animal);
    }
    unset($animal);
    

    循环后的unset 清除引用。否则,您会在循环之后保留对 $animal 中最后一个数组元素的引用,如果您忘记这一点会导致烦人的问题,然后稍后使用 $animal 做其他事情。

    另一种选择是使用密钥替换它:

    foreach ($animals as $key => $animal) {
        $animals[$key] = getOffSpring($animal);
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用对数组中值的引用

      foreach ($animals as &$animal) {
          $animal = getOffSpring($animal);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 2018-02-07
        • 2020-02-02
        • 2015-11-02
        • 1970-01-01
        • 2019-09-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多