【问题标题】:Filter array by first letter按第一个字母过滤数组
【发布时间】:2011-03-22 22:35:33
【问题描述】:

我正在构建一个平台。在我的代码的某处,有一个看起来像这样的数组(PHP):

$entries = array('p01','p02','g01','g02','a001','a002')

我需要编写一个脚本,根据第一个字母过滤数组。例如,询问那些以“p”开头的人会给我

$filtered_entries = array('p01','p02');

同样,如果我询问以“g”或“a”开头的字母,它也会给我。知道如何做到这一点吗?

【问题讨论】:

    标签: php arrays filtering


    【解决方案1】:

    这种类型的解决方案更加直观动态。 在这个例子中,有几种类型的解决方案:

    • 搜索首字母
    • 对大写字母敏感
    • is_array() 所以如果它倾向于避免几个错误

    <?php
    
    /*
     * Search within an asociative array
     * Examples:
     * $array = array('1_p01','1_P02','2_g01','2_g02','3_a001','3_a002');
     * find_in_array($array,'2');
     * return:  array( 2 => '2_g01',3 => '2_g02')
     *
     * find_in_array($array,'2',false);
     * return:  array( 1 => '1_P02')
     *
     * find_in_array($array,'P0',false,false);
     * return: array( 0 => '1_p01',1 => '1_P02')
     *
     */
    
    function find_in_array($array, $find='', $FirstChar=true, $CaseInsensitive=true){
        if ( is_array($array) ){
            return preg_grep("/".($FirstChar ? '^':'')."{$find}/".($CaseInsensitive ? '':'i'), $array);
        }
    }
    
    $array = array('1_p01','1_P02','2_g01','2_g02','3_a001','3_a002');
    
    $a = find_in_array($array,'2');
    var_export($a);
    /*
    Return: 
    array (
      2 => '2_g01',
      3 => '2_g02'
    )
    */
    
    $a = find_in_array($array,'P0',false);
    var_export($a);
    /*
    Return: 
    array (
      1 => '1_P02'
    )
    */
    
    $a = find_in_array($array,'P0',false,false);
    var_export($a);
    /*
    Return: 
    array (
      0 => '1_p01',
      1 => '1_P02'
    )
    */
    

    【讨论】:

      【解决方案2】:
      $entries = array('p01','p02','g01','g02','a001','a002');
      print_r(
          preg_grep('~^p~', $entries) // or preg_grep("~^$letter~",.....
      );
      

      http://php.net/manual/en/function.preg-grep.php

      【讨论】:

        【解决方案3】:

        这是使用闭包生成过滤器函数的一种方法。

        function filter_factory($letter) {
            return function ($input) use ($letter) {
                return is_string($input) && $input[0] === $letter;
            };
        }
        
        $entries   = array('p01','p02','g01','g02','a001','a002');
        $p_entries = array_filter($entries, filter_factory('p'));
        

        【讨论】:

          【解决方案4】:
          $entries = array('p01','p02','g01','g02','a001','a002');
          
          $filterVar = null;
          
          function filterFunction($v) {
              global $filterVar;
          
              if (substr($v,0,1) == $filterVar) {
                  return $v;
              }
          }
          
          $filterVar = 'a';
          $newEntries = array_filter($entries,'filterFunction');
          
          
          var_dump($newEntries);
          

          【讨论】:

            【解决方案5】:

            PHP 中有一个array_filter() 函数,您可以使用它来完成此操作:

            $filtered = array_filter($array, create_function('$a', 'return $a[0] == "' . $letter . '";'));

            我会留给你概括处理所有字母的函数。

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

            【讨论】:

            • 技术上有效,但是为所有不同的字符创建所有函数可能会变得有些麻烦。
            • 我谈到泛化是为了暗示有一种简单的方法可以处理 Brandon Wang 可能需要的所有字母,而不是复制、粘贴和更改代码中的一个字符。
            • 最好使用var_export而不是简单的字符串连接。
            • 啊,旧的create_function,对我来说总是很像eval,自从关闭以来,我真的几乎忘记了它。这确实是一个有效的工作示例。
            • @jmz 感谢您的帮助!我对我应该如何概括这段代码有点困惑:(你能帮忙吗?
            【解决方案6】:
            function filter_array($array, $letter){
            $filtered_array=array();
             foreach($array as $key=>$val){
              if($val[0]==$letter){
               $filtered_array[]=$val;
              }
             }
            return $filtered_array;
            }
            

            这样就可以得到所有的p了

            $entries = array('p01','p02','g01','g02','a001','a002')
            $filtered=filter_array($entries, 'p');
            

            【讨论】:

              【解决方案7】:
              class FirstCharFilter {
                  public $char = 'p';
                  function filter(array $array){
                      return array_filter($array,array($this,'checkFirstChar'));
                  }
                  public function checkFirstChar($a){
                     return $a[0] == $this->char;
                  }
              }
              $filter = new FirstCharFilter();
              $filter->char = 'p';
              var_dump($filter->filter($array));
              $filter->char = 'g';
              var_dump($filter->filter($array));
              

              或者如果你只需要循环,扩展FilterIterator

              class FirstCharIterator extends FilterIterator {
                  public $char = '';
                  function accept(){
                      $string = $this->current();
                      return is_string($string) && $string[0] == $this->char;
                  }
              }
              $iter = new FirstCharIterator(new ArrayIterator($array));
              $iter->char = 'p';
              foreach($iter as $item) echo $item."\n";
              

              【讨论】:

              • 喜欢使用迭代器。
              猜你喜欢
              • 2013-09-13
              • 2012-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-25
              • 1970-01-01
              • 1970-01-01
              • 2012-09-14
              相关资源
              最近更新 更多