我的目标是从一维数组键中删除一组字符,并从同一数组的值中删除另一组字符。示例:
$arr = [
'a' => 'Letter A!',
'`b`' => 'Letter B w/quotes...',
' c ' => 'Letter C w/spaces?',
' -_-`d`- _ - ' => 'Letter D w/all?!...'
];
$invalid_keys_chars = ['`',' ','_','-'];
$invalid_vals_chars = ['!','?','.'];
// GOAL: looking for something like this function
array_del_invalid($arr, $invalid_keys_chars, $invalid_vals_chars));
var_export($arr);
// ---> output
// array (
// 'a' => 'Letter A',
// 'b' => 'Letter B w/quotes',
// 'c' => 'Letter C w/spaces',
// 'd' => 'Letter D w/all'
// )
我首先研究了常见的PHP函数:
array_walk
example:允许按引用替换值,但是如果我还在回调参数中按引用传递键,则不会发生同样的情况; array_replace
:密钥也未修改; array_map
example:构造数组的副本,但必须对array_keys($arr)
进行以前的处理。所以我的目标是一次性执行所有替换操作,避免重复使用循环数组多次的PHP函数。
我尝试放置answer on this same thread,但仍有效,但我想不出一种避免unset($arr[$invalid_key])
的方法(还有另一种方法可以“更改”密钥本身而不删除它) ?),或者如果键和值字符串都需要替换,则仅执行一次分配。
已经有这样做的PHP函数吗?即单回路,少量条件,最少更换量和整体效率更高?如果没有,我该如何改善我的?
答案 0 :(得分:1)
不,PHP中无法通过引用修改数组键。您只能添加和删除密钥。
即使array_change_key_case
也会创建一个新数组,而不用修改原始数组。
您可以在函数中创建一个新数组,然后返回新数组。然后,您可以使用干净版本覆盖原始数组变量。
<?php
function deleteInvalid($dirty, $ikc = [], $ivc = []) {
$clean = [];
foreach ($dirty as $key => $val) {
$cKey = str_replace($ikc, '', $key);
$cVal = str_replace($ivc, '', $val);
$clean[$cKey] = $cVal;
}
return $clean;
}
$dirty = deleteInvalid($dirty);
var_dump($dirty);
您不需要测试str_replace之后值的变化,因为如果未更改,它将保持不变。除非您的数组当然不止是字符串,否则……在这种情况下,您应该在修改之前测试值的类型。
<?php
if (is_string($val)) {
// do something with the string.
}
答案 1 :(得分:0)
function array_del_invalid(&$a, $ikc = [], $ivc = []) {
if(! empty($ikc) || ! empty($ivc)) {
foreach ($a as $k => $v) {
$treated_key = str_replace($ikc, '', $k);
$treated_val = str_replace($ivc, '', $v);
if($k !== $treated_key) {
unset($a[$k]);
$a[$treated_key] = $v;
}
if($v !== $treated_val) {
$a[$treated_key] = $treated_val;
}
}
}
}
$arr = [
'a' => 'Letter A!',
'`b`' => 'Letter B w/quotes...',
' c ' => 'Letter C w/spaces?',
' -_-`d`- _ - ' => 'Letter D w/all?!...'
];
$original_arr = $arr;
$invalid_keys_chars = ['`',' ','_','-'];
$invalid_vals_chars = ['!','?','.'];
array_del_invalid($arr, $invalid_keys_chars, $invalid_vals_chars);
var_export($arr);
// ---> output
// array (
// 'a' => 'Letter A',
// 'b' => 'Letter B w/quotes',
// 'c' => 'Letter C w/spaces',
// 'd' => 'Letter D w/all'
// )
// only keys replacement
$arr = $original_arr;
array_del_invalid($arr, $invalid_keys_chars);
var_export($arr);
// array (
// 'a' => 'Letter A!',
// 'b' => 'Letter B w/quotes...',
// 'c' => 'Letter C w/spaces?',
// 'd' => 'Letter D w/all?!...',
// )
{@ {3}}在线运行。