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

sha*_*ine 2 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)
Run Code Online (Sandbox Code Playgroud)

mic*_*usa 5

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

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

代码:(演示

$arr = array("  one", "  two", array("  three"));
array_walk_recursive($arr,function(&$v){$v=ltrim($v);});
var_export($arr);
Run Code Online (Sandbox Code Playgroud)

输出:

array (
  0 => 'one',
  1 => 'two',
  2 => 
  array (
    0 => 'three',
  ),
)
Run Code Online (Sandbox Code Playgroud)

至于您的自定义函数,可以这样编写以提供成功的结果:

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
Run Code Online (Sandbox Code Playgroud)

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

} else {
    $array[$key] = trimAll($value);
}
Run Code Online (Sandbox Code Playgroud)

你会发现它$array[$key]会被替换为NULL. 解决方案是$value通过&$value在 foreach 循环中使用来通过引用进行修改。


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

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
Run Code Online (Sandbox Code Playgroud)

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

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));
Run Code Online (Sandbox Code Playgroud)