我正在构建一个平台。某处在我的代码,有看起来像这样(PHP)的数组:按首字母筛选排列
$entries = array('p01','p02','g01','g02','a001','a002')
我需要编写一个过滤器根据首字母排列的脚本。例如,要求那些具有起始字母“p”会给我
$filtered_entries = array('p01','p02');
同样,如果我问那些首字母“G”或“A”它会给我那些为好。任何想法如何做到这一点?
我正在构建一个平台。某处在我的代码,有看起来像这样(PHP)的数组:按首字母筛选排列
$entries = array('p01','p02','g01','g02','a001','a002')
我需要编写一个过滤器根据首字母排列的脚本。例如,要求那些具有起始字母“p”会给我
$filtered_entries = array('p01','p02');
同样,如果我问那些首字母“G”或“A”它会给我那些为好。任何想法如何做到这一点?
PHP中,你可以用它来做到这一点的array_filter()
功能:
$filtered = array_filter($array, create_function('$a', 'return $a[0] == "' . $letter . '";'));
我要把它留给你来概括来处理所有信件的功能。
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";
就像使用迭代器一样。 – 2010-07-29 20:10:55
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');
$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);
以下是使用闭包生成过滤函数的一种方法。
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'));
$entries = array('p01','p02','g01','g02','a001','a002');
print_r(
preg_grep('~^p~', $entries) // or preg_grep("~^$letter~",.....
);
+1正是我的答案,只是打我吧:) – 2010-07-29 20:08:58
技术上有效的,但创建的所有不同的字符全部功能可能变得有些繁琐。 – Wrikken 2010-07-29 20:11:18
我谈到了泛化,暗示有一种简单的方法可以处理所有Brandon Wang可能需要的信件,而不是复制,粘贴和更改代码中的一个字符。 – jmz 2010-07-29 20:15:57