我的 $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
你看,你的子数组元素没有受到影响的原因是 $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));
关于php - 如何递归地从多维数组中的每个值中删除周围的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298576/