指定した文字列を置換してくれるstr_replace()関数。この関数、全ての引数に文字列だけではなく配列も使用でき、とても便利です。ただ、便利だからとあんまり調子に乗ると・・・?

今回は、str_replace()関数の使用法と、その際のちょっとした注意点について 紹介します。

str_replace()に関しては以前のTIPSメーリングリスト(http: //www.phppro.jp/phptips/archives/vol2/)でも少し触れられていますが、引数 を配列に使用した際の挙動について、簡単におさらいしておきましょう。

以下のように、第1引数に配列、第2引数に文字列を指定すると、配列の各値に 該当する文字列が全て、第2引数に指定した文字列に置換されます。

<?php
$search 
= array("a""b""c""d");
$replace "Z";
$subject "abcde";

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
string(5) "ZZZZe"

第1、第2引数が共に配列を指定した場合、第1引数の各要素に対応した第2引 数の要素が置換に使用されます。 第2引数の方が要素数が少なく、対応する要素がない場合は、空文字列""に置換 されます。

<?php
$search 
= array("a""b""c""d""e");
$replace = array("1""2""3""4");
$subject "abcde";

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
string(4) "1234"

置換対象の第3引数にも配列が使用できて、その場合、第3引数の各要素に対し て順次置換が行われていきます。

<?php
$search 
= array("a""b""c""d");
$replace = array("1""2""3""4");
$subject = array("abc""dcba");

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
array(2) {
  [0]=>
  string(3) "123"
  [1]=>
  string(4) "4321"
}

このように、str_replaceは配列を引数としてとることで非常に便利に使えます。

ただ、上記のように配列を引数として使用する際には、少し癖のある動作が存 在します。 それは、再帰的な置換が行われるという点と、2次元以上の配列を用いた場合です。

まず、この関数は第1引数の配列の先頭から順に、置換対象の文字列に対して再 帰的に置換をしていきます。

<?php
$search 
= array("a""b""c""1");
$replace = array("1""2""3""4");
$subject "abcd";

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
string(4) "423d"

この結果は、一度"a"が"1"に置換された後、さらに"1"が"4"で置換されたものです。 なので、再帰的な置換を行いたくない場合は、第2回のTIPSメーリングリスト(http: //www.phppro.jp/phptips/archives/vol2/)で取り上げられているとおり、strtr 関数を使うとよいでしょう。

また、引数で使用できる配列は、2次元以上の配列には対応していません。 第1、第2引数に2次元以上の配列を使用しようとすると、Noticeを吐いて強制 的に文字列型へ型変換したものを置換に使用します。

<?php
$search 
= array(array("a""b"), "c""d", array("e""f"));
$replace = array(array("1""2"), "3""4""5""6");
$subject = array("abcdef""This is Array");

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
Notice: Array to string conversion in C:\usr\hoge.php on line 6
array(2) {
  [0]=>
  string(6) "ab34ef"
  [1]=>
  string(9) "This is 5"
}

第3引数に2次元以上の配列を指定した場合には、その部分に関しては一切の置 換が行われず、そのままの内容が返されます。

<?php
$search 
= array("a""b""c""d");
$replace = array("1""2""3""4");
$subject = array("ab""cd", array("ab""cd"));

$result str_replace($search$replace$subject);

var_dump($result);
?>

結果:
array(3) {
  [0]=>
  string(2) "12"
  [1]=>
  string(2) "34"
  [2]=>
  array(2) {
    [0]=>
    string(2) "ab"
    [1]=>
    string(2) "cd"
  }
}

そのため、2次元以上の配列の中身を置換しようと考える場合は、相応の処理で1 次元まで落とし込む必要があります。

なお蛇足ですが、これらの挙動は、PHP5から追加されたstr_ireplace関数でも同 様です。

普段使う分には余り気にしないような点ですが、頭の片隅にとどめておくと何か のときに役に立つかもしれません。

str_replace : http://www.phppro.jp/phpmanual/php/function.str-replace.html



(アシアル 亀本大地)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。