【问题标题】:Why I'm not able to add new key value pair in an associative array?为什么我无法在关联数组中添加新的键值对?
【发布时间】:2014-10-10 16:22:29
【问题描述】:

我有一个名为 $data 的大型关联数组。为了您的理解,我在其中的一个元素下方打印。

Array
(
    [0] => Array
        (

            [id] => 92
            [zip_code] => 07080
            [phone_no] => 7327630062
            [amount] => 
            [currency] => $
            [product_details] => Array
                (
                )

        )
    [1] => Array
        (

            [id] => 93
            [zip_code] => 07081
            [phone_no] => 7327630063
            [amount] => 20
            [currency] => $
            [product_details] => Array
                (
                )

        )
)

现在我想在上述关联数组的每个元素中创建一个新的键值对,标题为$data。为此,我编写了以下逻辑,但它没有创建新的键值对。有人可以在这方面帮助我吗?

foreach($data as $key => $value) {
        if(!empty($value['amount'])) { 
          $value['final_amount'] = $value['amount'] - 2;
        } else 
          $value['final_amount'] = '';        
      }

【问题讨论】:

  • 执行 foreach 时,PHP 会创建副本,因此执行 $value = something 实际上不会影响原始数组
  • 尝试通过引用传递$value
  • 此外,您的数组似乎是关联数组的索引数组。你可以做for ($i=0; $i<count($data); $i++){ $data[$i]['something'] = 'something'; }
  • @Jonathon 我同意你的第一条评论,但我不同意第二条。 foreach 循环有效
  • @Jonathon 这会增加在循环的每次迭代中调用count() 函数的开销。

标签: php arrays multidimensional-array associative-array key-value


【解决方案1】:

来自manual of foreach

为了能够在循环内直接修改数组元素 在 $value 之前加上 &。在这种情况下,该值将由 参考。

foreach($data as $key => &$value)

【讨论】:

  • 手册也包含此警告,这是一个很好的做法:Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset(). 在这种情况下,应在循环正下方添加一个unset($value); 语句。
  • @yitwail:我认为这是噪音。如果乍一看并不清楚$value 的范围,您可能还是应该进行一些重构。
【解决方案2】:

foreach 循环中,通过在变量名前添加一个& 符号& 通过引用传递$value

foreach($data as $key => &$value)

这将允许循环修改原始$data,而不是修改它的副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多