PHPのsplitで文字列を分解して配列で返す方法【初心者向け】

プログラミング初心者向けにsplit関数を使って文字列を分解して配列で返す方法について解説しています。推奨のpreg_splitの使い方、explode関数との違いについて実際にソースコードを書きながら説明しています。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

PHPのsplitで文字列を分解して配列で返す方法について解説しています。

PHP5.3からsplit関数を使うことは非推奨となり、preg_splitを使うことが多くなりましたが、explode関数との違いについても触れているので、ぜひ理解していきましょう。

そもそもPHPが何か分からない場合は、先にPHPとはの記事をご覧ください。

 

なお本記事は、TechAcademyのPHPオンライン講座の内容をもとにしています。

 

大石ゆかり

split関数というのは何でしょうか?

田島悠介

文字列を何らかの文字で区切って、配列として分割してくれる関数なんだよ。

大石ゆかり

文字列が区切られているってことは、文章というよりもデータに近い感じですか?

田島悠介

そうそう。URLなんかもスラッシュで区切られてるよね。とりあえずsplit関数について見てみよう!

 

split(preg_split)関数とは

splitは、正規表現で文字列を分割する関数です。

文字列、あるいは文字列が入った変数に対して何らかの条件で分割し、配列にして返してくれます。

 

splitは非推奨

PHP5.3からはsplitが非推奨となりました。

spliteの代替えの関数は、preg_splitになります。 PHPが採用している正規表現は複数あり、PHPのsplit関数が内部で使用するのはPOSIX正規表現です。

PHPのバージョンが上がり続ける中でPOSIX正規表現自体が非推奨となった(regex拡張モジュールが非推奨)ことで PCREモジュールのPerl互換正規表現を使用するpreg_split関数を使うようにしなくてはならないということです。

preg_splitもsplitとほぼ同じで、正規表現ルールにもとづいて、文字列を分割して返します。

 

splitとexplodeの違い

splitには、同じように文字列を分割して配列にするexplodeという関数もあります。

splitの代替えであるpreg_splitも一緒に挙動を確認してみましょう。 a,b,cという文字列をカンマを区切りにして分割してみます。

<?php
  $a = "a,b,c"; 
  $b = split(",",$a); 
  $c = explode(",",$a);
  $d = preg_split("/,/",$a); 
  print_r($b); 
  print_r($c); 
  print_r($d); 
?>

「print_r」で出力される配列の中身は全部同じになります。

「explode」は、文字によって文字列を分割して、配列として返す関数です。

「split(preg_split)」は、正規表現によって文字列を分割して、配列として返す関数です。

「/,/」では、正規表現を駆使した感じには見えませんので、後で実際に正規表現らしいものを使用してみます。 explodeは、正規表現を使わない分、速い。 splitは、正規表現を使う分、遅いと覚えても構いません。

 

大石ゆかり

正規表現で分割する、区切るって難しそうですね。

田島悠介

explode関数のほうが使う頻度が高いので、そういうことも出来るって覚えるぐらいでいいかな。

大石ゆかり

わかりました!

 

split(preg_split)関数の書き方

splitとpreg_splitの書き方を見てみます。

//配列を返す
split ( パターン文字列 , パターンで区切る対象文字列 [, 分割リミット数 = -1 ] ) 
//配列を返す 
preg_split ( パターン文字列 , パターンで区切る対象文字列[, 分割リミット数 = -1 [, フラグオプション = 0 ]] )

「$pattern」は、文字列を区切る正規表現を書きます。 $string($subject)には、区切って配列として分割する文字列や文字列が入っている変数を指定します。

「$limit」は、オプションで省略しても構わないのですが、分割の最大数を指定できます。残った場合、最後に詰め込まれます。 -1というのは省略時の初期値で制限無し(条件に従っていくつでも分割する)という意味になります。

$flagsはpreg_splitにしかないオプションですが、配列として返す値に条件をつけることが出来ます。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

split(preg_split)を実際に書いてみよう

フォームから入力された検索文字列から空白を除去して分割してみます。 半角の空白が複数あるかもしれません。

その場合、単純に半角空白で区切った場合、配列の1つの値が空白になってしまいます。 全角の空白の場合文字コードはどうなるでしょうか?

<?php //フォームから受け取った文字列 
  $keyword = "プログラミング 学習サイト テックアカデミー"; 
  $keyword = mb_convert_kana($keyword, 's','utf-8'); 
  $array_keyword = preg_split('/[\s]+/', $keyword, -1, PREG_SPLIT_NO_EMPTY); 
  print_r($array_keyword); 
?>

「mb_convert_kana」で全角スペースを半角スペースに変換。 全角スペースは文字コードによって異なるので、文字コードを指定します。

正規表現を/[\s]+/にして、1つ以上の連続した半角スペースで分割。 「\s」は空白を意味してします。+はそれを1回以上続くことを意味します。

「PREG_SPLIT_NO_EMPTY」は、オプションで空文字列以外だけを返すようにします。 「print_r」の表示結果が、空白を含まず、それぞれの文字だけが配列に代入されていれば成功です。

文字列を分割して配列として返す関数には、「explode」や「split(preg_split)」などがある。 というのを覚えておけば大丈夫です。

 

おわりに

PHPのpreg_split関数の使い方を解説しました。

頻繁に利用する関数ではないですが、いざという時に便利なので、ぜひ書き方を覚えておきましょう。

 

大石ゆかり

空白が、バックスラッシュとsで表現されてますね。+は一回以上って意味なんですか?

田島悠介

そうそう。ちょっと難しいけど正規表現の書き方なんだ。

大石ゆかり

文字で区切るexplodeのほうがわかりやすいですね。

田島悠介

正規表現によって複雑に区切るのが、preg_split関数、単純に文字で区切るのがexplodeって覚えるといいね。

 

また、PHPを勉強していて、

  • もっと効率的に勉強したい
  • 誰かに聞きながら学びたい
  • 自分でWebサービスを作りたい

と思ったことはないでしょうか。

 

そんな方のために、TechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。