【问题标题】:Filter an array so that only keys starting with a specified string remain过滤数组,以便只保留以指定字符串开头的键
【发布时间】:2012-12-17 12:55:23
【问题描述】:

我有一个包含多个键的数组,我正在寻找一个回调来删除所有不符合特定条件的键(在这种情况下以“电子邮件”开头)。

为此我一直在查看array_walk(),但无论如何,输出始终是1。我猜这个功能不是最适合这个任务,所以有人知道更好的方法吗?谢谢。

$test = array_walk($args, '_check_key_start_callback', 'email');

function _check_key_start_callback(&$value, $key, $str){

    return strncmp($key, $str, strlen($str));

}

【问题讨论】:

  • 这是什么certain criteria
  • 当然 array_filter() 会比 array_walk() 更好地删除你不想要的条目
  • 还要注意 $test 将是一个布尔值 0/1 来识别 array_walk() 是否成功... array_walk() 通过引用传递数组
  • @MarkBaker - array_filter() 只检查值,而不是键,它是我需要过滤的键。另外,我想我明白你对 array_walk() 的意思了——也就是说,它不是真的适合这份工作!
  • @Jelmer - 我的标准是在代码中定义的,但我会修改这个问题,让大家更清楚。谢谢。

标签: php arrays filter callback


【解决方案1】:

你必须使用 array_map() 而不是 array_walk()...

【讨论】:

    【解决方案2】:

    我会这样做,使用array_keys 和 lambda 函数:

    $yourArray = array(
      'email' => 'some@email.com',
      'foo' => 'bar'
    );
    
    $allowedKey = "email";
    
    $newArray = array_filter(array_keys($yourArray), function($key) use($yourArray, $allowedKey){
    
      return strncmp($yourArray[$key], $allowedKey, strlen($allowedKey)) === 1;
    
    });
    

    不管怎样,给猪涂口红。

    【讨论】:

      【解决方案3】:

      这应该可行:

      $args = array_intersect_key(
          $args,
          array_flip(array_filter(array_keys($args), function($key) {
              return preg_match('/^email/', $key);
          }))
      );
      

      【讨论】:

        猜你喜欢
        • 2015-03-03
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 2014-07-18
        相关资源
        最近更新 更多