Массив фильтров PHP - PullRequest
       11

Массив фильтров PHP

5 голосов
/ 13 декабря 2010

Мне нужно немного советов, как это сделать. У меня есть массив строк PHP. Предполагается, что строки представляют собой PIN-коды, состоящие из 6 цифр, например:

560095

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

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

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

Ответы [ 5 ]

18 голосов
/ 13 декабря 2010

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

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

$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 голосов
/ 13 декабря 2010

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

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

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

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

Передача массива в функцию PHP preg_grep вместе с регулярным выражением вернет новый массив только с соответствующими значениями.

0 голосов
/ 13 декабря 2010

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

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

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

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

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

0 голосов
/ 13 декабря 2010

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

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

$new_array = preg_filter('/^(\d{3}) ?(\d{3})$/D', '$1$2', $array);
0 голосов
/ 13 декабря 2010

Если вы просто хотите перебрать действительные ответы (зациклить их), вы всегда можете использовать 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 для больших массивов. Но это также будет медленнее, если вы выполняете итерацию несколько раз (но для одной итерации она должна быть быстрее из-за использования памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...