php - 如何递归地从多维数组中的每个值中删除周围的空格

标签 php recursion multidimensional-array

我的 $arr 数组中的每个字符串值都包含 2 个前面的空格。我想使用 trim() 方法删除这些空格。此外,我想对 $arr 数组中的任何数组执行相同的操作,假设数组中有无限数量的数组。我试图递归地这样做但没有成功。

虽然可能有一个内置的 php 方法可以为我执行此操作,但我正在学习,并且想知道为什么这个代码块不起作用以及可以进行哪些争论来修复它。

$arr = array("  one", "  two", array("  three"));

function trimAll(&$array) {
  foreach($array as $key => $value) {
    if(gettype($value) !== "array") {
        $array[$key] = trim($value);
    } else {
        trimAll($value);
    }
  }
}

trimAll($arr);

echo $arr[0];//"one" (worked)
echo $arr[1];//"two" (worked)
echo $arr[2][0];// "  three"(didn't work)

最佳答案

在这种情况下最好/最简单的调用函数是:array_walk_recursive()。没有必要重新发明 php 已经为此目的设计的功能。它只访问“叶节点”,因此您无需检查它是否正在处理数组类型的元素。

您只需要通过引用修改元素(在匿名函数参数中使用&)。我将演示 ltrim(),因为您的输入字符串只有前导空格,但您可以使用 trim() 来处理字符串两边的空格。

代码:(Demo)(PHP7.4 and higher version)

array_walk_recursive(
    $arr,
    function(&$v) {
        $v = ltrim($v);
    }
);

输出:

array (
  0 => 'one',
  1 => 'two',
  2 => 
  array (
    0 => 'three',
  ),
)

至于你的自定义函数,它可以这样写来提供一个成功的结果:

function trimAll(&$array) {     // modify the original input array by reference
    foreach ($array as &$value) {  // modify each value by reference
        if (!is_array($value)) {      // if it is not an array
            $value = trim($value);    // trim the string
        } else {
            trimAll($value);        // recurse
        }
    }
}

trimAll($arr);                  // modify the array (no return value from function call)
var_export($arr);               // print the array

你看,你的子数组元素没有受到影响的原因是 $valuetrimAll($value) 之间没有发生赋值。您设置 trimAll 的方式不会返回值。所以,即使你使用:

} else {
    $array[$key] = trimAll($value);
}

您会发现 $array[$key] 将被替换为 NULL。解决方案是通过在 foreach 循环中使用 &$value 使 $value 可通过引用修改。


好像这个答案还不够长,这里有一种方法可以重新配置您的函数,以便它返回修改后的数组,而不是修改输入数组而不返回。

function trimAll($array){            // input array is not modifiable
    foreach ($array as &$value) {      // $value IS modifiable
        if (is_array($value)) {        // if an array...
            $value = trimAll($value);  // assign recursion result to $value
        } else {                       // not an array...
            $value = trim($value);     // trim the string
        }
    }
    return $array;                   // return the new trimmed array
}
var_export(trimAll($arr));           // now trimAll() can be directly printed to screen

或者如果您希望完全避免通过引用进行修改:

function trimAll($array) {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $array[$key] = trimAll($value);
        } else {
            $array[$key] = trim($value);
        }
    }
    return $array;
}
var_export(trimAll($arr));

关于php - 如何递归地从多维数组中的每个值中删除周围的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298576/

相关文章:

php - 如何使用 php 编辑购物车中的数量框?

java - 实现复合模式的递归函数?

c - 将 double 组设置为等于返回值而不声明维度

javascript - 如何使用递归求解模数(不能使用 *、% 或数学运算符)

arrays - 仅根据相同的索引号对齐数组?

php - 如何在php中使用mysql查询多维数组?

php - 从 mysql 数据库中突出显示日期选择器中的事件

PHP/MySQL : Access data in Array of Dictionaries

php - 仅在 PHP DOM 中选择没有命名空间/前缀的节点?

java - 学习java,找不到符号