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

Php 如何递归地从多维数组中的每个值中删除周围的空格,php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,my$arr数组中的每个字符串值都包含两个前面的空格。我想使用trim()方法删除这些空格。此外,我想对$arr数组中的任何数组执行相同的操作,假设数组中有无限多个数组。我试图递归地这样做,但没有成功 虽然可能有一个内置的php方法可以帮我做到这一点,但我正在学习,并且想知道为什么这个代码块不能工作,以及可以通过什么修改来修复它 $arr = array(" one", " two", array(" three")); function trimAll(&$array) {

my
$arr
数组中的每个字符串值都包含两个前面的空格。我想使用
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\u walk\u recursive()
。没有必要重新设计php已经为此目的设计的函数。它只访问“叶节点”,所以您不需要检查它是否正在处理数组类型的元素

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

代码:()

输出:

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
您知道,子数组元素不受影响的原因是
$value
trimAll($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));
简单的方法

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

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

trimAll($arr);

是的,有一个内置的PHP函数可以解决您的问题。是的

但在您的情况下,您可能需要这样做:

解决方案1: 解决方案2:
干杯。

解决方案1仅适用于最多两个级别的输入阵列。是的,OP的示例输入只有2个级别,但是此页面上的递归解决方案应该能够处理无限数量的级别。解决方案2符合简要说明。此答案缺少教育意义上的解释。
$arr = array("  one", "  two", array("  three"));

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

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

function removeSpaces($object)
{
    if (is_array($object)) {
        $object = array_map('trim', $object);
    } else {
        $object = trim($object);
    }

    return $object;
}


$output = array_map('removeSpaces', $input);
$input = array("  one", "  two", array("  three"));

function array_map_recursive(callable $func, array $array) {
    return filter_var($array, \FILTER_CALLBACK, ['options' => $func]);
}

$output = array_map_recursive('trim', $input);