Categories PHP-MySQL

Chuẩn hoá dữ liệu số điện thoại bằng PHP

Xửa lý số điện thoại có thể là yêu cầu quan trọng trong nhiều bài toán. Đặc biệt là những bài toán liên quan đến con người, thí dụ số điện thoại nhân viên trong công ty, số điện thoại khách hàng của bạn, số điện thoại những người bạn muốn chào hàng, số điện thoại của người dân trong quận huyện, v.v…


Tại sao phải chuẩn hoá? chuẩn hoá ở đâu?

Số điện thoại được lưu trong cơ sở dữ liệu. Trước khi người ta lưu người ta sẽ phải nhập dữ liệu vào. Sau khi người ta lưu người ta sẽ lấy dữ liệu ra.

Khi chuẩn hoá, tức là ta chuẩn hoá dữ liệu lưu vào cơ sở dữ liệu. Chuẩn hoá đó có các tác dụng:

  • Phát hiện & loại bỏ sai sót ở khâu nhập dữ liệu;
  • Giúp các thao tác lấy & khai thác dữ liệu đơn giản và chính xác hơn;

Thế nào là phát hiện & loại bỏ sai sót ở khâu nhập dữ liệu?

Hãy quan sát số điện thoại này 094 694 00 87 – đấy là cách tôi viết số điện thoại, nhưng người khác có thể viết thế này 0946 940 087, hay 094.694.0087, hoặc 094-6940-087

Như trên gọi là cách trình bày dữ liệu khác nhau. Nếu ta không chuẩn hoá, tất cả dữ liệu này sẽ được lưu vào cơ sở dữ liệu – điều này làm dữ liệu không đồng nhất, và thường là thừa thãi thông tin, chẳng các khoảng trống và dấu chấm, hay dấu cách là không cần thiết (nó cần thiết về mặt hiển thị ra ngoài, nhưng không cần thiết để lưu dữ liệu).

Với cơ sở dữ liệu lớn, người ta rất quan tâm đến khâu tiết kiệm này, tôi có thể tiết kiệm được từ 10 tới 20% dung lượng dữ liệu.

Rồi lại còn có thể người ta nhập sai nữa, chẳng hạn nhập thiếu số, hay thừa số. Một chương trình tốt, sẽ biết là người điều này, vì nó biết rằng với kiểu mẫu như vậy cần có đủ 10 số.

Vừa rồi tôi trình bày hơi ngược, đúng ra, người ta phải phát hiện có sai sót hay không trước, sau đó mới chuẩn hoá nó rồi lưu. Nhưng thường thì để phát hiện sai sót, người ta lại phải chuẩn hoá trước. Tẹo nữa bạn sẽ thấy ví dụ dễ hiểu hơn.

Có người có thể nói, sao phải chuẩn hoá, lúc lấy dữ liệu đầu ra mình xử lý cũng không sao mà. Để tôi giải thích:

Nếu bạn không chuẩn hoá dữ liệu vào để lưu, đúng là bạn vẫn có thể xử lý sau khi bạn cần dữ liệu, nhưng bạn có thấy là như vậy vẫn tốn một công không? Vẫn tốn một công nhưng chuẩn hoá trước giúp dữ liệu sạch sẽ đáng tin cậy hơn, tiết kiệm dung lượng. Vậy thì sao không làm trước?


Giải quyết bài toán

Tất cả các dạng biến thể của 0946 940 087 (094.694.0087; 094-6940-087;…) cần đưa về dạng thuần nhất: 0946940087

Tức là liền một khối, không có khoảng cách nào giữa các số.

Như vậy chúng ta chỉ cần chẻ số điện thoại ra thành các phần khác nhau, rồi loại bỏ những thành phần không phải là số, cuối cũng ghép những phần còn lại theo thứ tự lần lượt.

Ví dụ 094.694.0087 sẽ được chia như thế này: 0 / 9 / 4 / . / 6 / 9 / 4 / . / 0 / 0 / 8 / 7

Hai có dấu chấm sẽ bị vứt đi vì nó không phải là số. Vậy là xong.

Code thực tế:

function dienthoai_chuan ($dt) {
 $dt_array=(str_split($dt));
 for ($i=0; $i<count($dt_array); $i++) {
 if (($dt_array[$i]!="0") && ($dt_array[$i]!="1") && ($dt_array[$i]!="2") && ($dt_array[$i]!="3") && ($dt_array[$i]!="4")
 && ($dt_array[$i]!="5") && ($dt_array[$i]!="6") && ($dt_array[$i]!="7") && ($dt_array[$i]!="8")
 && ($dt_array[$i]!="9")) {
 $dt_array[$i]="del";
 }

 }
 $dt_chuan="";
 for ($i=0; $i<count($dt_array); $i++) {
 if ($dt_array[$i]!="del") {
 $dt_chuan = $dt_chuan.$dt_array[$i];}
 }
 return $dt_chuan;
 }

Ở đây tôi dùng hàm, bởi vì khâu chuẩn hoá này có thể sẽ dùng ở nhiều nơi khác nhau, dùng hàm giúp bạn tiết kiệm công sức gõ code hơn.

Các lệnh sử dụng:

  • str_split là hàm cắt chuỗi, nó sẽ cắt chuỗi số điện thoại thành từng phần tử. Chú ý là lúc này ta xem số điện thoại như là chuối ký tự vì nó không thuần tuý là số;
  • str_split cắt và đưa các phần từ vào trong mảng, ta dùng tiếp hàm for để kiểm tra các phần tử xem có phải là số không. Hàm for sẽ chạy từ phần từ đầu tiên đến phần tử cuối cùng;
  • Hàm count để để đếm số lượng của mảng;
  • Hàm if là hàm điều kiện. Những công dụng như hàm if và hàm for được dùng rất thường xuyên trong bất cứ ngôn ngữ lập trình nào, do vậy bạn nên nắm rõ;

Với khối lệnh ban đầu, tôi tìm tất cả những phần tử không phải là số rồi tôi đổi nó thành del.

Tiếp theo tôi lại chạy tiếp để rồi cứ phần từ nào là del tôi sẽ không ráp lại nữa. Do vậy cái cuối cũng mà tôi có sẽ chỉ là các số thuần tuý.

Gợi ý khác: thay vì khá mất công như tôi làm là so sánh từng phần tử với 0, 1, 2, 3,.., 9 bạn có thể thử dùng hàm sau is_numeric($r) – nó sẽ xác định xem phần tử đó có phải là số không.

Comments are closed.

Back to Top