代码之家  ›  专栏  ›  技术社区  ›  CPHPython

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

  •  0
  • CPHPython  · 技术社区  · 6 年前

    我的目标是从 一维

    $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函数。

    我放了一个 answer on this same thread 我的尝试是有效的,但我想不出一个办法来避免 unset($arr[$invalid_key]) (是否有其他方法可以“更改”密钥本身而不删除它?)或者如果键和值字符串都需要替换,则只执行一个赋值。

    是否已经有一个PHP函数可以做到这一点?也就是说,单回路,很少的条件,最少的替换和整体更有效?如果没有,我该如何改进我的?

    2 回复  |  直到 6 年前
        1
  •  1
  •   R. Chappell    6 年前

    不,在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);
    

    您不需要测试stru\u replace之后值的更改,因为如果没有更改,它将是相同的。当然,除非你的数组包含的不仅仅是字符串。。。在这种情况下,您应该在修改之前测试值的类型。

    <?php
    if (is_string($val)) {
        // do something with the string.
    }
    
        2
  •  0
  •   CPHPython    6 年前

    不使用 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

    推荐文章