2010-12-13 2 views
5

Мне нужно немного советов о том, как это сделать. У меня есть массив строк PHP. Строки должны представлять PIN-коды, которые имеют 6-ти цифр, как:PHP filter array

560095 

Имея место после 3 цифр также считается действительным, как 560 095

Все элементы массива являются недопустимыми. Я хочу помочь сделать эту фильтрацию, чтобы получить новый массив всех действительных PIN-кодов.

Я искал и, похоже, может использовать регулярное выражение. Это верно?

ответ

17

Да, вы можете использовать регулярное выражение для этого.

PHP имеет функцию preg_grep, на которую вы передаете свое регулярное выражение, и возвращает новый массив с записями из массива , который соответствует шаблону.

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

Объяснение регулярного выражения:

^  - 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

Да, вы можете использовать регулярные выражения, чтобы убедиться, что есть 6 цифр с или без пробела.

Аккуратный инструмент для игры с регулярными выражениями RegExr ... вот что RegEx я придумал:

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

Это соответствует началу строки ^, то любые три числа [0-9]{3} с последующим необязательным пробел \s?, а затем еще три номера [0-9]{3}, а затем конец строки $.

Передача массива в функцию PHP preg_grep вместе с Regex вернет новый массив с соответствующими совпадениями.

0

Если вы просто хотите перебрать действительные ответы (петля над ними), вы всегда можете использовать 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 
} 

Это имеет преимущество, не копируя весь массив (он вычисляет следующий когда ты хочешь это). Таким образом, это намного эффективнее памяти, чем что-то делать с preg_grep для больших массивов. Но он также будет медленнее, если вы повторите несколько раз (но для одной итерации он должен быть быстрее из-за использования памяти).

0

Если вы хотите получить массив действительных PIN-кодов, используйте codaddict's answer.

Вы могли бы также, в то же время, как фильтрация только допустимые ПИНы, снимите дополнительный пробел, чтобы все PINs стали 6 цифр с помощью preg_filter:

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

Лучший ответ может зависеть от ситуации, но если вы хотите сначала выполнить простую и недорогую проверку ...

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

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

После этого, вы могли бы в равной степени пойти и сделать некоторые проверки типов - до тех пор, как действительные числа не начинаются с 0, в этом случае это может быть более трудным.

Если вы не ошиблись рано, переходите к уже существующим решениям регулярных выражений.