【问题标题】:Changing value inside foreach loop doesn't change value in the array being iterated over在 foreach 循环中更改值不会更改正在迭代的数组中的值
【发布时间】:2017-01-18 18:29:00
【问题描述】:

为什么会这样:

foreach( $store as $key => $value){
$value = $value.".txt.gz";
}

unset($value);

print_r ($store);

Array
(
[1] => 101Phones - Product Catalog TXT
[2] => 1-800-FLORALS - Product Catalog 1
)

我正在尝试获取 101Phones - 产品目录 TXT.txt.gz

对发生了什么的想法?

编辑:好吧,我找到了解决方案...我数组中的变量有我看不到的值...正在做

$output = preg_replace('/[^(\x20-\x7F)]*/','', $output);
echo($output);

清理并使其正常工作

【问题讨论】:

    标签: php foreach


    【解决方案1】:

    文档http://php.net/manual/en/control-structures.foreach.php 清楚地说明了您遇到问题的原因:

    “为了能够直接修改循环内的数组元素,在$value之前加上&。在这种情况下,值将通过引用来分配。”

    <?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &$value) {
        $value = $value * 2;
    }
    // $arr is now array(2, 4, 6, 8)
    unset($value); // break the reference with the last element
    ?>
    

    只有在可以引用迭代数组的情况下(即如果它是一个变量),才可能引用 $value。以下代码不起作用:

    <?php
    /** this won't work **/
    foreach (array(1, 2, 3, 4) as &$value) {
        $value = $value * 2;
    }
    ?>
    

    【讨论】:

    • 当我按照你的第一个例子时,我仍然得到这个:数组(.txt.gz => 101Phones - 产品目录 TXT .txt.gz => 1-800-FLORALS - 产品目录 1)为什么是否将我的密钥分配为我添加到变量中的文本?
    • 如果有人碰巧像我在我之后那样偶然发现这个问题,那么大多数时候这就是这个问题的解决方案。 OP,如果您再次登录,请考虑将此标记为正确答案...
    【解决方案2】:

    试试

    foreach( $store as $key => $value){
        $store[$key] = $value.".txt.gz";
    }
    

    【讨论】:

      【解决方案3】:

      数组中的$value变量是临时的,它不引用数组中的条目。
      如果要更改原始数组条目,请使用参考:

      foreach ($store as $key => &$value) {
                             //  ^ reference
          $value .= '.txt.gz';
      }
      

      【讨论】:

      • 当我这样做时,它给了我:数组(.txt.gz => 101Phones - 产品目录 TXT .txt.gz => 1-800-FLORALS - 产品目录 1)
      • 它当然不应该那样做。发布产生该结果的完整代码。
      • 我刚刚意识到我的变量有点奇怪......我创建了一个数组 $stores=array("tree","boat");它奏效了...有什么好的方法可以删除看不见的字符?
      【解决方案4】:

      您正在重写循环中的值,而不是数组中的键引用。

      试试

       $store[$key] = $value.".txt.gz";
      

      【讨论】:

        【解决方案5】:

        传递$value 作为参考:

        foreach( $store as $key => &$value){
           $value = $value.".txt.gz";
        }
        

        【讨论】:

          【解决方案6】:

          试试

          $catalog = array();
          
          foreach( $store as $key => $value){
              $catalog[] = $value.".txt.gz";
          }
          
          
          print_r ($catalog);
          

          foreach( $store as $key => $value){
              $store[$key] = $value.".txt.gz";
          }
          
          
          print_r ($store);
          

          取决于你想要达到的目标

          谢谢 :)

          【讨论】:

          • 它省略了 .txt.gz 数组([1] => 101Phones - 产品目录 TXT [2] => 1-800-FLORALS - 产品目录 1)
          【解决方案7】:

          我相信这就是你想要做的:

          foreach( $store as $key => $value){
          $store[$key] = $value.".txt.gz";
          }
          
          unset($value);
          
          print_r ($store);
          

          【讨论】:

            【解决方案8】:

            数组映射怎么样:

            $func = function($value) { return $value . ".txt.gz"; };
            print_r(array_map($func, $store));
            

            【讨论】:

              【解决方案9】:
              foreach(array_container as & array_value)
              

              是在foreach循环中修改数组元素值的方式。

              【讨论】:

                猜你喜欢
                • 2018-08-12
                • 2013-07-14
                • 1970-01-01
                • 2021-08-03
                相关资源
                最近更新 更多