我有一个数组($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';真的有效吗?
希望这能回答您的问题:)