2010-07-29 61 views
0

我正在构建一个平台。某处在我的代码,有看起来像这样(PHP)的数组:按首字母筛选排列

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

我需要编写一个过滤器根据首字母排列的脚本。例如,要求那些具有起始字母“p”会给我

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

同样,如果我问那些首字母“G”或“A”它会给我那些为好。任何想法如何做到这一点?

回答

8

PHP中,你可以用它来做到这一点的array_filter()功能:

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

我要把它留给你来概括来处理所有信件的功能。

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

+0

+1正是我的答案,只是打我吧:) – 2010-07-29 20:08:58

+0

技术上有效的,但创建的所有不同的字符全部功能可能变得有些繁琐。 – Wrikken 2010-07-29 20:11:18

+0

我谈到了泛化,暗示有一种简单的方法可以处理所有Brandon Wang可能需要的信件,而不是复制,粘贴和更改代码中的一个字符。 – jmz 2010-07-29 20:15:57

1
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"; 
+0

就像使用迭代器一样。 – 2010-07-29 20:10:55

0
function filter_array($array, $letter){ 
$filtered_array=array(); 
foreach($array as $key=>$val){ 
    if($val[0]==$letter){ 
    $filtered_array[]=$val; 
    } 
} 
return $filtered_array; 
} 

这样使用它来获取所有普的

$entries = array('p01','p02','g01','g02','a001','a002') 
$filtered=filter_array($entries, 'p'); 
0
$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); 
0

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

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'));