如何从数组的键和值中删除/替换某些字符?

时间:2018-09-19 10:46:14

标签: php arrays replace str-replace array-key

我的目标是从一维数组键中删除一组字符,并从同一数组的值中删除另一组字符。示例:

$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函数吗?即单回路,少量条件,最少更换量和整体效率更高?如果没有,我该如何改善我的?

2 个答案:

答案 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)

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

{@ {3}}在线运行。