teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ソースコードの細部を修正

2017/02/21 07:00

投稿

kunai
kunai

スコア5405

answer CHANGED
@@ -14,9 +14,9 @@
14
14
  //市外局番を配列で管理。あとで照合するときに全件で照合させると効率が悪いので、先頭2桁をキーにして分割(DBから取得でも良い)
15
15
  $shigaiKyokubanList = array(
16
16
  '01' => array('011', '0123', '0124', '0125'・・・),
17
- '02' => array('022', '0220', '0223'・・・),
17
+ '02' => array('0220', '0223', '0224'・・・),
18
18
  '03' => array('03'),
19
- '04' => array('0422', '042', '0428'・・・
19
+ '04' => array('0422', '0428', '042'・・・
20
20
  ・・・
21
21
  );
22
22
  $telList = getTelList(); //ここで、DBから電話番号の全件をselectしてきたモノとします。

1

ソースコードを修正

2017/02/21 07:00

投稿

kunai
kunai

スコア5405

answer CHANGED
@@ -10,7 +10,8 @@
10
10
 
11
11
  以下、PHPでやった場合の処理となります。
12
12
 
13
- ```
13
+ ```PHP
14
+ //市外局番を配列で管理。あとで照合するときに全件で照合させると効率が悪いので、先頭2桁をキーにして分割(DBから取得でも良い)
14
15
  $shigaiKyokubanList = array(
15
16
  '01' => array('011', '0123', '0124', '0125'・・・),
16
17
  '02' => array('022', '0220', '0223'・・・),
@@ -22,14 +23,17 @@
22
23
 
23
24
  $separatedTelList = array();//tel1, tel2, tel3に分割された電話番号を格納する配列
24
25
 
26
+ //電話番号リストをループ
25
27
  foreach($telList as $tel) {
28
+ //市外局番の配列のうち、先頭2桁をキーとして2階層目の配列を取り出し、ループ
26
29
  foreach($shigaiKyokubanList[substr($tel, 0, 2)] as $shigaiKyokuban) {
27
-
30
+ //候補の市外局番から始まる前提で正規表現マッチング
28
- if(!preg_match('/^('.$shigaiKyokuban.')([0-9]+)([0-9]{4})/', $matches) || count($matches) < 4) {
31
+ if(!preg_match('/^('.$shigaiKyokuban.')([0-9]+)([0-9]{4})$/', $matches) || count($matches) < 4) {
29
- //エラー処理
32
+ //マッチしない場合、次の市外局番と照合する
33
+ continue;
30
34
  } else {
35
+ //マッチした場合、tel1, tel2, tel3をキーとする配列に格納する
31
36
  $separatedTelList[] = array('tel1' => $matches[1], 'tel2' => $matches[2], 'tel3' => $matches[3]);
32
37
  }
33
-
34
38
  }
35
39
  ```