【问题标题】:Using str_replace and foreach to remove characters from a multidimensional array: issues with scope?使用 str_replace 和 foreach 从多维数组中删除字符:范围问题?
【发布时间】:2013-06-21 15:03:36
【问题描述】:

我有一个数组($arr):

[0] => Array
    (
        [sv_317] => 1,650
        [sv_318] => 1,254

    )


[1] => Array
    (
        [sv_317] => 1,580
        [sv_318] => 1,580

    )

我正在尝试将这些元素值用作数字值,因此需要删除所有非数字字符(上例中的逗号)。

为此,我正在使用:

foreach($arr as $k=>$v)
    {       
    $v[sv_317] = str_replace(",", "", $v[sv_317]);
    $v[sv_317] = preg_replace('/\s+/', '', $v[sv_317]);
    $v[sv_318] = str_replace(",", "", $v[sv_318]);
    $v[sv_318] = preg_replace('/\s+/', '', $v[sv_318]);

    echo "318 :".$v[sv_318];
    echo "317 :".$v[sv_317];
    }

回声只是为了测试它是否按照我的意图进行,并且确实它们打印了没有逗号或空格的元素的值。

但是这并没有导致能够以数字方式使用元素,所以我用 print_r($arr); 测试了数组。紧随上述循环之后,数组元素似乎不受影响(即仍然包含逗号。

这里有范围问题吗?如果是这样,我怎样才能永久删除逗号?

非常感谢。

【问题讨论】:

    标签: php scope str-replace


    【解决方案1】:

    由于您要更改 $v,它需要是一个引用变量,如下所示:

    foreach($arr as $k => &$v) {       
      $v[sv_318] = str_replace(",", "", $v[sv_318]);
    }
    

    ...但是您的代码中还有更多需要修复的地方:

    • 你应该在最后unset($v),这样后面的代码就不会奇怪了
    • 应该引用数组索引,因为它们是字符串文字。
    • 我更喜欢 strtr() 而不是 str_replace(),因为对应关系更清晰:

    .

    foreach($arr as $k => &$v) {
      $v['sv_318'] = strtr( $v['sv_318'], array(','=>'') );
    }; unset($v);
    

    另外,要处理 $v 中的任意数量的值,我会使用另一个 foreach:

    foreach ($arr as $key => &$subarr) {       
      foreach ($subarr as $subkey => &$val) {       
        $val = strtr( $val, array(','=>'') );
      }; unset($val);
    }; unset($subarr);
    

    【讨论】:

      【解决方案2】:

      foreach 循环不适用于数组本身。它适用于数组的副本。因此,当您执行 print_r($arr) 时,它会显示原始数组。实际的数组 $arr 没有被修改。

      来自 PHP foreach 文档:

      为了能够在循环中直接修改数组元素在$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
      ?>
      

      查看此 SO 帖子以了解 foreach 的实际工作原理: How does PHP 'foreach' actually work?

      希望这能回答你的问题:)

      【讨论】:

      • 哦!那么以这种方式编辑数组的最佳方法是什么?
      • 创建新的(空)数组(循环前)并在其中添加(推送)更改的值(循环内)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多