如何 remove/replace 来自数组中的键和值的某些字符?
How to remove/replace certain characters from both keys and values in an array?
我的目标是从 一维 数组的键中删除一组字符,并从同一数组的值中删除另一组字符。示例:
$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 循环多次数组的函数。
我在我的尝试中放置了一个 ,这是有效的,但我想不出避免 unset($arr[$invalid_key])
的方法(是否有另一种方法来 "change" 密钥本身而不删除它?)或者如果键和值字符串都需要替换则只进行一次赋值。
是否已经有一个 PHP 函数可以执行此操作? IE。单循环,条件少,替换最少,整体效率更高?如果没有,我该如何改进?
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?!...',
// )
不,在 PHP 中您无法通过引用修改数组键。您只能添加和删除密钥。
即使array_change_key_case
也会创建一个新数组而不是修改原来的数组。
您可以在函数中创建一个新数组,return 新数组。然后你可以用干净的版本覆盖你原来的数组变量。
<?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.
}
我的目标是从 一维 数组的键中删除一组字符,并从同一数组的值中删除另一组字符。示例:
$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 循环多次数组的函数。
我在我的尝试中放置了一个 unset($arr[$invalid_key])
的方法(是否有另一种方法来 "change" 密钥本身而不删除它?)或者如果键和值字符串都需要替换则只进行一次赋值。
是否已经有一个 PHP 函数可以执行此操作? IE。单循环,条件少,替换最少,整体效率更高?如果没有,我该如何改进?
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?!...',
// )
不,在 PHP 中您无法通过引用修改数组键。您只能添加和删除密钥。
即使array_change_key_case
也会创建一个新数组而不是修改原来的数组。
您可以在函数中创建一个新数组,return 新数组。然后你可以用干净的版本覆盖你原来的数组变量。
<?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.
}