我的$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)
答案 0 :(得分:1)
在这种情况下调用的最佳/最简单的函数是:array_walk_recursive()
。没有必要重新发明php已经为此目的设计的功能。它只访问"叶节点"所以你不需要检查它是否正在处理一个数组类型的元素。
您只需要通过引用修改元素(使用匿名函数参数中的&
)。我演示ltrim()
因为您的输入字符串只有前导空格,但您可以使用trim()
来处理字符串两边的空格。
代码:(Demo)
$arr = array(" one", " two", array(" three"));
array_walk_recursive($arr,function(&$v){$v=ltrim($v);});
var_export($arr);
输出:
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));
答案 1 :(得分:1)
是的,有一个内置的PHP函数可以解决您的问题。它是array_map()
但在你的情况下,你可能需要这样做:
$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);
干杯。
答案 2 :(得分:0)
简单方法,
$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);