CSVのような複数の単語や数字をスペースやコンマで区切った文字列を、プログラムで処理しやすい配列に変換するPHPの関数がexplodeです。
このような関数は、他のプログラム言語でsplitが使われることが多いかもしれません。しかし、PHPでは、split関数は使えません。今回は、このexplode関数について詳しく解説します。
目次
文字列を配列に変換すると便利な機能
PHPに限らず、プログラムの中で文字列から一部を切り出し、それをプログラムの中で使うことはよくあります。ただし、PHPには文字列を加工する関数が幾つもあるので、その中から最適な方法を選択するのが基本です。
そのような幾つもあるPHPの文字列を加工する関数の中で、区切り文字により、文字列を配列に変換する関数が今回紹介するexpodeです。この関数で配列に変換できれば、繰り返し処理など、プログラムの中で便利に使えます。
explodeについて解説する前に、文字列を配列に変換して処理で使うメリットについて解説します。
プログラムが扱う文字列には規則がある
プログラムで処理する文字列のほとんどは、ある決まった規則に基づいて作られています。例えば、表計算アプリのデータをWebシステムなどで活用する際に使われるCSVファイル(Comma Separated Value file)は、その名前のとおり、コンマで区切られた値を格納するフォーマットです。
他にも、スペースやコロンで区切られたフォーマットを持つログファイルなどもよく使われます。そのようなファイルでは、区切り文字さえ解れば、簡単なプログラムで解析に必要なデータを取り出すことが可能です。
文字を切り出す方法
プログラムの中で長い文字列の中から、その一部を切り出すとしたら、どうすればいいでしょうか。最も簡単な方法は、切り出す文字の位置を調べて、その部分だけ切り出す方法です。もし、1つの文字列だけを切り出すなら、この方法でもいいでしょう。
しかし、あるフォーマットに従って作られた文字列の中から、そのフォーマットの何番目の文字列を切り出す場合、この方法は使えません。あらかじめ、区切り文字を数えて、そこから、次の区切り文字の位置まで切り出す、といった処理が必要です。
それなら、区切り文字で分割した複数の文字列を作り、その何番目の文字列、と指定すれば簡単です。そのため、区切り文字を使い、文字列を配列に変換する処理がよく使われています。
文字列を配列に変換すると便利な理由
先ほど、文字列を配列に変換する方法がよく使われると説明しましたが、具体的にどのような点が便利なのでしょうか。
特定のフォーマットに従って作られたログファイルの1行を配列に変換した場合、何番目の文字列は、そのまま配列の何番目にあたります。また、配列を使った繰り返し処理の中で、条件に一致する文字列だけ抜き出す、といった処理にも使えます。
なお、実際のプログラムの中で、配列は繰り返し処理と同時によく使われる機能です。explode関数は、そのような処理の前処理として、よく利用されています。
explodeの基本
先ほど紹介したように、文字列を区切り文字によって配列に分割する関数として、PHPにはexplodeが組み込まれています。そして、文字列を配列に変換する処理は、プログラムの中でよく使われる機能です。
そのため、explodeは利用頻度が高い関数の1つなので、ぜひ、その使い方をマスターしてください。次から、explode関数の文法などの基本について解説します。
explodeの文法
explode関数は、第1引数に区切り文字、第2引数に文字列を指定すると、文字列を区切り文字で分割した配列を返します。
explode( 区切り文字, 文字列 )
例えば、スペースで区切られた5つの数字が書かれた文字列から、その数字を分割して配列に格納する場合、次のように書きます。
1 2 3 4 |
explodeの簡単な例 $sting = "10 20 30 40 50"; $arr = explode(" ". $string); |
この例では、$arrには、[“10″,”20″,”30″,”40″,”50”]という配列が格納されています。
以前はsplit関数が使えた
PHPのexplodeのように、文字列を配列に変換する関数は、他のプログラム言語にもあります。例えば、Perlにはsplit関数があり、JavaやRubyで使えるのはsplitメソッドです。では、なぜ、PHPではsplitではなく、explodeなのでしょうか。
実は、古いPHPのバージョンでは、split関数が使えました。使い方は、今のexplode関数と同じです。しかし、PHPのバージョン7で廃止されたので、今は使えません。
なお、PHPには、正規表現が使えるpreg_split関数や、文字列を1文字ずつの配列に変換するstr_split関数など、似た機能の関数があります。それらと区別するために、新しいバージョンで使えるのは、explode関数のみです。
explodeの戻り値の注意点
先ほど説明したように、explode関数は文字列を区切り文字で分割した配列を返します。しかし、次のようなケースでは注意が必要です。
もし、文字列に区切り文字が1つも含まれていない場合は、1番目に文字列をそのまま格納した配列が出力されます。また、区切り文字に空の文字列を指定した場合は、falseを返します。
explodeの使用例
先ほど解説したように、文字列を配列に変換するexplode関数は、PHPで文字列を扱うプログラムでよく使われる関数の1つです。次から、explodeを使った特徴的なプログラムの例を紹介します。
区切り文字で分割する
explode関数を使う最も簡単な例が、1つしか無いことが解っている区切り文字を使い、文字列を2つに分割する例です。次に、メールアドレスを「@」で分割する例を紹介します。
1 2 3 4 |
$input_text = trim(fgets(STDIN)); $arr = explode("@", $input_text); echo "account = " . $arr[0] . "\n"; echo "domain = " . $arr[1] . "\n"; |
この例は、標準入力からメールアドレスを入力すると、「@」で分割し、「@」の左側を「account =」の次に、反対側を「domain =」の次に表示します。なお、標準入力の処理では、fgets(STDIN)などでキーボードなどから文字を入力し、trim関数で改行コードを削除しています。
この例を実行した結果は、次の通りです。
1 2 3 4 |
$ sample1.php info@sample.com account = info domain = sample.com |
通常、文字を分割する場合、区切り文字の位置を計算して、その前後を切り出したりしますが、このように、文字の位置が解らなくても、explode関数を使うことで簡単に文字列を分割できます。
与えられた複数の数字の合計を求める
explode関数を使い、配列に変換するメリットの1つは、個数が解らなくても、文字列から区切り文字で分割できる点です。その例を次に紹介します。
1 2 3 4 5 6 7 |
$input_text = trim(fgets(STDIN)); $arr = explode(" ", $input_text); $out = 0; foreach($arr as $item) { $out = $out + (int)$item; } echo out . "\n"; |
この例は、先ほどの例と同じく標準入力から、空白で区切られた数字を幾つか入力すると、それらの合計を表示します。
こちらも標準入力から入力された文字列に対して、改行を削除する処理が「trim(fgets(STDIN))」です。また、explode関数で分割した文字列を格納した配列は、「foreach($arr as $item)」による繰り返し処理を使い、順に$itemとして取り出し、「$out = $out + (int)$item;」で整数に変換した後、合計を計算しています。
この例を実行した結果は、次の通りです。
1 2 3 4 |
$ php sample2.php 10 20 30 40 50 150 $ |
まとめ
今回説明したように、PHPで文字列を扱う場合、区切り文字で分割して配列に変換するexplode関数が便利です。単純に2分割する場合でも使えるうえ、CSVのような複数の要素を含む文字列にも使えます。さらに、配列に変換することで繰り返し処理で使える点もメリットです。
実際に利用されているPHPのプログラムでもよく利用される関数なので、ぜひ、使い方をマスターして活用してください。