0

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

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

非常感谢。

4

2 回答 2

2

由于您要更改 $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);
于 2013-06-24T23:41:05.207 回答
1

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' 如何实际工作?

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

于 2013-06-24T23:33:48.147 回答