2010-12-13 30 views
5

Tôi cần một chút lời khuyên về cách thực hiện điều này. Tôi có một chuỗi các chuỗi PHP. Các chuỗi có nghĩa vụ phải đại diện cho mã PIN mà là 6 chữ số như:Mảng lọc PHP

560095 

Có một không gian sau khi 3 chữ số cũng được coi là hợp lệ khi 560 095

Tất cả các phần tử mảng là không hợp lệ. Tôi muốn được trợ giúp thực hiện việc lọc này để có được một mảng mới của tất cả các mã PIN hợp lệ.

Tôi đã tìm kiếm và có vẻ như tôi có thể phải sử dụng cụm từ thông dụng. Đúng không?

Trả lời

17

Có bạn có thể sử dụng regex cho việc này.

PHP có chức năng được gọi là preg_grep mà bạn chuyển biểu thức chính quy của mình và nó trả về một mảng mới với các mục nhập từ nhập mảng phù hợp với mẫu.

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

Giải thích về 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

Có, bạn có thể sử dụng một biểu thức chính quy để đảm bảo có 6 chữ số có hoặc không có khoảng trắng.

Một công cụ gọn gàng để chơi với biểu thức thông thường là RegExr ... đây là những gì RegEx tôi đến với:

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

Nó phù hợp với đầu của chuỗi ^, sau đó bất kỳ ba số [0-9]{3} tiếp theo là một tùy chọn không gian \s? được theo sau bởi ba số khác [0-9]{3}, tiếp theo là kết thúc của chuỗi $.

Chuyển mảng vào hàm PHP preg_grep cùng với Regex sẽ trả lại mảng mới chỉ với phân phù hợp.

0

Nếu bạn chỉ muốn để lặp qua các câu trả lời hợp lệ (vòng qua chúng), bạn luôn có thể sử dụng một 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 
} 

Nó có lợi ích của không sao chép toàn bộ mảng (nó tính kế tiếp khi bạn muốn nó). Vì vậy, nó có nhiều bộ nhớ hiệu quả hơn làm một cái gì đó với preg_grep cho mảng lớn. Nhưng nó cũng sẽ chậm hơn nếu bạn lặp lại nhiều lần (nhưng đối với một lần lặp lại nó sẽ nhanh hơn do việc sử dụng bộ nhớ).

0

Nếu bạn muốn nhận một mảng mã PIN hợp lệ, hãy sử dụng codaddict's answer.

Bạn cũng có thể, cùng lúc như lọc chỉ PIN hợp lệ, loại bỏ các nhân vật không gian tùy chọn sao cho tất cả PIN trở thành 6 chữ số bằng cách sử dụng preg_filter:

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

Câu trả lời tốt nhất có thể phụ thuộc vào tình hình của bạn, nhưng nếu bạn muốn thực hiện kiểm tra chi phí đơn giản và chi phí thấp trước ...

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

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

Sau đó, bạn có thể tiến hành kiểm tra kiểu khác nhau - miễn là số hợp lệ không bắt đầu bằng 0 trong trường hợp này có thể khó khăn hơn.

Nếu bạn không thất bại sớm, hãy tiếp tục với các giải pháp regex đã được đăng.