Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用str_replace和foreach从多维数组中删除字符:范围问题?_Php_Scope_Str Replace - Fatal编程技术网

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

Php 使用str_replace和foreach从多维数组中删除字符:范围问题?,php,scope,str-replace,Php,Scope,Str Replace,我有一个数组($arr): 我试图使用这些元素值作为数值,因此需要删除任何非数字字符(上面示例中的逗号) 为此,我正在使用: 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

我有一个数组($arr):

我试图使用这些元素值作为数值,因此需要删除任何非数字字符(上面示例中的逗号)

为此,我正在使用:

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];
    }
echos只是为了测试它是否在做我想要做的事情,而且可以肯定的是,它们打印的元素值没有逗号或空格

然而,这并没有导致能够使用数字元素,所以我用print_r($arr)测试了数组;紧接着上面的循环,数组元素似乎不受影响(即仍然包含逗号)

这里是否存在范围问题?如果是,如何永久删除逗号


非常感谢。

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

来自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
?>

查看此SO帖子,了解foreach的实际工作原理:


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

foreach循环不能与数组本身一起工作。它与数组的副本一起工作。因此,当您执行
print\r($arr)
时,它将显示原始数组。未修改实际数组$arr

来自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
?>

查看此SO帖子,了解foreach的实际工作原理:


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

因为您试图更改$v,所以它需要是一个参考变量,如下所示:

foreach($arr as $k => &$v) {       
  $v[sv_318] = str_replace(",", "", $v[sv_318]);
}
…但您的代码中还有更多问题需要解决:

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

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

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

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

foreach($arr as $k => &$v) {       
  $v[sv_318] = str_replace(",", "", $v[sv_318]);
}
…但您的代码中还有更多问题需要解决:

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

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

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

哦那么,以这种方式编辑数组的最佳方法是什么?创建新(空)数组(循环之前)并在其中添加(推送)更改的值(循环内部)?哦!那么,以这种方式编辑数组的最佳方法是什么?创建新(空)数组(循环之前)并在其中添加(推送)更改的值(循环内部)?