使用 array_walk_recursive 更新值时出现问题
Having problems updating values in with array_walk_recursive
我正在处理需要 str_replace 冒号和空格的代码。因为我不知道我的数组会有多深,所以我必须使用 array_walk_recursive 函数。问题是 str_replace 没有被计入帐户(读取不起作用)。请大家帮帮我。
这是我的代码
public function removeColonsFromStrings(array $inputs) {
d($inputs); // some dump function
array_walk_recursive($inputs, function (&$item, $key) {
$inputs[$key] = str_replace(':',' ', $item);
});
dd($inputs); //dump and die function
return $inputs;
}
输出如下
// first d() output
array(7) {
["GivenName"]=>
string(5) "Me"
["FamilyName"]=>
string(7) "Me"
["DisplayName"]=>
string(19) "[id:: 68]"
["CompanyName"]=>
string(19) "[id:: 68]"
["FullyQualifiedName"]=>
string(0) ""
["PrimaryPhone"]=>
array(1) {
["FreeFormNumber"]=>
string(0) ""
}
["PrimaryEmailAddr"]=>
array(1) {
["Address"]=>
string(24) "my@email.com"
}
}
// Second dd() output
array(7) {
["GivenName"]=>
string(5) "Me"
["FamilyName"]=>
string(7) "Me"
["DisplayName"]=>
string(19) "[id:: 68]"
["CompanyName"]=>
string(19) "[id:: 68]"
["FullyQualifiedName"]=>
string(0) ""
["PrimaryPhone"]=>
array(1) {
["FreeFormNumber"]=>
string(0) ""
}
["PrimaryEmailAddr"]=>
array(1) {
["Address"]=>
string(24) "my@email.com"
}
}
那么如何正确更新数组中的值?如果您需要任何其他信息,请告诉我,我会提供。谢谢!
您需要调整 $item
而不是 $inputs[$key]
。
发送引用时,您需要覆盖旧值。
array_walk_recursive($inputs, function (&$item, $key) {
$item = str_replace(':',' ', $item);
});
您正在通过引用修改叶节点值 (&
),因此您可以使用 values 变量(函数调用中的第一个参数)覆盖值,因此无需将键标识为函数调用中的第二个 variable/parameter。
Test/Proof: (Demo)
$inputs = ['a:', 'b:', ['c:'], 'd:'];
array_walk_recursive(
$inputs,
function(&$v) {
$v = str_replace(':', ' ', $v);
}
);
var_export($inputs);
或使用 PHP7.4 中的箭头函数:(Demo)
array_walk_recursive(
$inputs,
fn(&$v) => $v = str_replace(':', ' ', $v)
);
输出:
array (
0 => 'a ',
1 => 'b ',
2 =>
array (
0 => 'c ',
),
3 => 'd ',
)
在其他情况下,有时会调用 use(&$outputvariable)
以允许访问内部生成的数据,after/outside 函数。 但是,这不会像 array_walk_recursive()
的预期那样工作,因为 key
将是“深度无知”。将此效果视为 c
(key=[2][0]) 覆盖 a
(key=[0])
代码:
$inputs=['a:','b:',['c:'],'d:'];
array_walk_recursive($inputs,function($v,$k)use(&$result){
$result[$k]=str_replace(':',' ',$v);
});
var_export($result);
输出:
array (
0 => 'c ',
1 => 'b ',
3 => 'd ',
)
我正在处理需要 str_replace 冒号和空格的代码。因为我不知道我的数组会有多深,所以我必须使用 array_walk_recursive 函数。问题是 str_replace 没有被计入帐户(读取不起作用)。请大家帮帮我。
这是我的代码
public function removeColonsFromStrings(array $inputs) {
d($inputs); // some dump function
array_walk_recursive($inputs, function (&$item, $key) {
$inputs[$key] = str_replace(':',' ', $item);
});
dd($inputs); //dump and die function
return $inputs;
}
输出如下
// first d() output
array(7) {
["GivenName"]=>
string(5) "Me"
["FamilyName"]=>
string(7) "Me"
["DisplayName"]=>
string(19) "[id:: 68]"
["CompanyName"]=>
string(19) "[id:: 68]"
["FullyQualifiedName"]=>
string(0) ""
["PrimaryPhone"]=>
array(1) {
["FreeFormNumber"]=>
string(0) ""
}
["PrimaryEmailAddr"]=>
array(1) {
["Address"]=>
string(24) "my@email.com"
}
}
// Second dd() output
array(7) {
["GivenName"]=>
string(5) "Me"
["FamilyName"]=>
string(7) "Me"
["DisplayName"]=>
string(19) "[id:: 68]"
["CompanyName"]=>
string(19) "[id:: 68]"
["FullyQualifiedName"]=>
string(0) ""
["PrimaryPhone"]=>
array(1) {
["FreeFormNumber"]=>
string(0) ""
}
["PrimaryEmailAddr"]=>
array(1) {
["Address"]=>
string(24) "my@email.com"
}
}
那么如何正确更新数组中的值?如果您需要任何其他信息,请告诉我,我会提供。谢谢!
您需要调整 $item
而不是 $inputs[$key]
。
发送引用时,您需要覆盖旧值。
array_walk_recursive($inputs, function (&$item, $key) {
$item = str_replace(':',' ', $item);
});
您正在通过引用修改叶节点值 (&
),因此您可以使用 values 变量(函数调用中的第一个参数)覆盖值,因此无需将键标识为函数调用中的第二个 variable/parameter。
Test/Proof: (Demo)
$inputs = ['a:', 'b:', ['c:'], 'd:'];
array_walk_recursive(
$inputs,
function(&$v) {
$v = str_replace(':', ' ', $v);
}
);
var_export($inputs);
或使用 PHP7.4 中的箭头函数:(Demo)
array_walk_recursive(
$inputs,
fn(&$v) => $v = str_replace(':', ' ', $v)
);
输出:
array (
0 => 'a ',
1 => 'b ',
2 =>
array (
0 => 'c ',
),
3 => 'd ',
)
在其他情况下,有时会调用 use(&$outputvariable)
以允许访问内部生成的数据,after/outside 函数。 但是,这不会像 array_walk_recursive()
的预期那样工作,因为 key
将是“深度无知”。将此效果视为 c
(key=[2][0]) 覆盖 a
(key=[0])
代码:
$inputs=['a:','b:',['c:'],'d:'];
array_walk_recursive($inputs,function($v,$k)use(&$result){
$result[$k]=str_replace(':',' ',$v);
});
var_export($result);
输出:
array (
0 => 'c ',
1 => 'b ',
3 => 'd ',
)