如何 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 函数:

所以我的目标是一次性执行所有替换,避免重复使用 PHP 循环多次数组的函数。

我在我的尝试中放置了一个 ,这是有效的,但我想不出避免 unset($arr[$invalid_key]) 的方法(是否有另一种方法来 "change" 密钥本身而不删除它?)或者如果键和值字符串都需要替换则只进行一次赋值。

是否已经有一个 PHP 函数可以执行此操作? IE。单循环,条件少,替换最少,整体效率更高?如果没有,我该如何改进?

不使用 array library functions:

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?!...',
// )

运行在线@array_del_invalid on 3v4l.org.

不,在 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.
}