使用str_replace和foreach从多维数组中删除字符:范围问题


Using str_replace and foreach to remove characters from a multidimensional array: issues with scope?

我有一个数组($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)测试了数组;紧接在上面的循环之后,数组元素似乎没有受到影响(即仍然包含逗号.

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

非常感谢。

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

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

但在你的代码中还有更多需要修复的地方:

  • 您应该在末尾unset($v),这样后续代码就不会出现奇怪的行为
  • 数组索引应该加引号,因为它们是字符串文字
  • 与str_replace()相比,我更喜欢strtr(),因为对应关系更清晰:

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);

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的实际工作方式:PHP';foreach';真的有效吗?

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