2010-12-13 4 views
5

J'ai besoin de peu de conseils sur la façon de procéder. J'ai un tableau PHP de chaînes. Les chaînes sont censées représenter des codes PIN qui sont de 6 chiffres comme:Tableau de filtrage PHP

560095 

Avoir un espace après 3 chiffres est également considéré comme valide 560 095

Tous les éléments du tableau ne sont pas valides. Je veux de l'aide pour effectuer ce filtrage afin d'obtenir un nouveau tableau de tous les codes PIN valides.

J'ai cherché et on dirait que je peux avoir à utiliser des expressions régulières. Est-ce exact?

Répondre

17

Oui, vous pouvez utiliser regex pour cela.

PHP a une fonction appelée preg_grep à laquelle vous passez votre expression régulière et elle renvoie un nouveau tableau avec des entrées du tableau entrée qui correspondent au modèle.

$new_array = preg_grep('/^\d{3} ?\d{3}$/',$array); 

Explication de la regex:

^  - Start anchor 
\d{3} - 3 digits. Same as [0-9][0-9][0-9] 
? - optional space (there is a space before ?) 
     If you want to allow any number of any whitespace between the groups 
     you can use \s* instead 
\d{3} - 3 digits 
$  - End anchor 
2

Oui, vous pouvez utiliser une expression régulière pour vous assurer qu'il y a 6 chiffres avec ou sans espace.

Un outil propre pour jouer avec des expressions régulières est RegExr ... voici ce que RegEx je suis venu avec:

^[0-9]{3}\s?[0-9]{3}$ 

Il correspond au début de la chaîne ^, puis trois numéros [0-9]{3} suivi d'une option espace \s? suivi de trois autres chiffres [0-9]{3}, suivi par la fin de la chaîne $.

Passer le tableau dans la fonction PHP preg_grep avec le Regex retournera un nouveau tableau avec seulement indeces correspondant.

0

Si vous voulez juste itérer sur les réponses valides (boucle sur eux), vous pouvez toujours utiliser un RegexIterator:

$regex = '/^\d{3}\s?\d{3}$/'; 
$it = new RegexIterator(new ArrayIterator($array), $regex); 
foreach ($it as $valid) { 
    //Only matching items will be looped over, non-matching will be skipped 
} 

Il a l'avantage de ne pas copier le tableau entier (il calcule la suivante quand tu le veux). Il est donc beaucoup plus efficace de faire de la mémoire que de faire quelque chose avec preg_grep pour les grandes baies. Mais il sera également plus lent si vous itérez plusieurs fois (mais pour une seule itération, il devrait être plus rapide en raison de l'utilisation de la mémoire).

0

Si vous souhaitez obtenir un tableau des codes PIN valides, utilisez codaddict's answer.

Vous pouvez aussi, en même temps que le filtrage que les codes PIN valides, supprimez le caractère d'espace en option pour que tous les codes deviennent 6 chiffres en utilisant preg_filter:

$new_array = preg_filter('/^(\d{3}) ?(\d{3})$/D', '$1$2', $array); 
0

La meilleure réponse pourrait dépendre de votre situation, mais si vous vouliez faire un contrôle simple et à faible coût d'abord ...

$item = str_replace(" ", "", $var); 

if (strlen($item) !== 6){ 
echo 'fail early'; 
} 

Après cela, vous pouvez également aller et faire quelques vérifications de type - tant que numéros valides ne pas commencer par un 0 dans ce cas est peut-être plus difficile.

Si vous n'échouez pas trop tôt, continuez avec les solutions regex déjà publiées.