【问题标题】:PHP array_filter, how to get the key in callback?PHP array_filter,如何在回调中获取密钥?
【发布时间】:2011-10-08 21:38:36
【问题描述】:

array_filter — 使用回调函数过滤数组元素

array array_filter ( array $input [, callback $callback ] )

callback能否获取当前数组值的key以及如何获取?

【问题讨论】:

    标签: php arrays callback array-filter


    【解决方案1】:

    来自文档: PHP 5.6.0 添加了可选的标志参数和常量ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH

    http://php.net/manual/en/function.array-filter.php

    【讨论】:

      【解决方案2】:

      在之前的评论中,您概述了您实际上正在寻找这样的东西:

      foreach ($t as $k => $v)
          if (!array_key_exists($k, $valid))
              unset($t[$k])
      

      所以实际上要从数组$t 中删除所有在数组$valid 中没有键的值。

      用于此的 PHP 函数称为 array_intersect_key。交集等于过滤后的结果:

      $filtered = array_intersect_key($t, $valid);
      

      【讨论】:

        【解决方案3】:

        通过使用ARRAY_FILTER_USE_BOTH 常量,您可以获得值和键:

        array_filter($arrFoo, function ($value, $key) { return 'name' === $key && $value > 1 }, ARRAY_FILTER_USE_BOTH)
        

        通过使用ARRAY_FILTER_USE_KEY 常量,您可以单独获取密钥:

        array_filter($arrFoo, function ($key) { return 'name' === $key }, ARRAY_FILTER_USE_KEY)
        

        【讨论】:

          【解决方案4】:

          没有办法让array_filter的回调访问元素的键,也没有类似的函数可以做你想要的。

          但是,您可以为此编写自己的函数,如下所示:

          function arrayfilter(array $array, callable $callback = null) {
              if ($callback == null) {
                  $callback = function($key, $val) {
                      return (bool) $val;
                  };
              }
              $return = array();
              foreach ($array as $key => $val) {
                  if ($callback($key, $val)) {
                      $return[$key] = $val;
                  }
              }
              return $return;
          }
          
          $test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0);
          
          $array = arrayfilter($test_array, function($key, $val) {
             return is_string($key);
          });
          print_r($array);
          /*
          Array
          (
              [a] => the a
              [b] => the b
          )
          */
          
          $array = arrayfilter($test_array);
          print_r($array);
          /*
          Array
          (
              [0] => foo
              [a] => the a
              [b] => the b
              [11] => 1101
          )
          */
          

          【讨论】:

            【解决方案5】:

            您可以使用此处讨论的 array_walk 函数(第 3 个答案):is it possible if callback in array_filter receive parameter?

            【讨论】:

            • 太棘手了,我正在使用索引数组而不是关联数组。在该解决方案中,密钥是硬编码的。
            • 也许更标准的 codeforeach ($arr as $key => $val) {} 实现可以满足您的需求。
            • 我需要过滤输入数组:如果键存在于另一个数组中,则返回元素。我找到了array_filter 候选人,但我无法在回调中获取当前数组值的键。
            • 那是:foreach ($t as $k => $v) if (!array_key_exists($k, $valid)) unset($t[$k]) 但对我来说看起来很可怕......
            • 这就是我将如何实现您迄今为止所描述的内容。
            【解决方案6】:

            我不喜欢这里建议的其他选项,如果其他人正在寻找此功能,这里有一个快速实现:

            function array_filter_keys($a, $c){
                $i=array_filter(array_keys($a), $c);
                return array_intersect_key($a, array_flip($i));
            }
            

            这个函数的结果正是它听起来的样子,它将返回一个由回调函数过滤的数组,该回调函数接收键而不是值。

            编辑: 这更像是一种免责声明,在阅读了其他一些 cmets 之后,我意识到 OP 实际上只是在寻找 array_intersect,正如 hakre 指出的那样。我会在这里留下这个答案,因为 OPs 问题没有明确说明需要,并且这个页面显示在 google 中的 array_filter_keys

            【讨论】:

              猜你喜欢
              • 2011-02-08
              • 1970-01-01
              • 2012-10-21
              • 2012-08-03
              • 1970-01-01
              • 2018-11-29
              • 2020-05-13
              • 1970-01-01
              • 2014-08-16
              相关资源
              最近更新 更多