2010-07-29 3 views
0

Je construis une plate-forme. Quelque part dans mon code, il y a un tableau qui ressemble à ceci (PHP):Réseau de filtres par première lettre

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

J'ai besoin d'écrire un script qui filtre le tableau en fonction de la première lettre. Par exemple, en demandant à ceux de la première lettre « p » me donnerait

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

De même, si je demandais ceux qui à partir lettre « g » ou « a » il me donnerait ceux aussi bien. Une idée de comment accomplir cela?

Répondre

8

Il y a une fonction array_filter() en PHP que vous pouvez utiliser pour ce faire:

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

Je vais laisser à vous de généraliser la fonction pour gérer toutes les lettres.

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

+0

+1 Exactement ma réponse, me battre pour elle :) –

+0

Techniquement valide, mais la création de toutes les fonctions de tous les différents personnages peut devenir un peu lourd. – Wrikken

+0

J'ai parlé de généralisation pour laisser entendre qu'il y a un moyen simple de le faire pour toutes les lettres dont Brandon Wang pourrait avoir besoin qui ne consiste pas à copier, coller et modifier un caractère dans le code. – jmz

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

Ou si vous avez seulement besoin de boucle, étendre 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

Comme l'utilisation de l'itérateur. –

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

l'utiliser comme ceci pour obtenir

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

Voici une façon de générer des fonctions de filtrage à l'aide d'une fermeture.

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