指定した文字列を置換してくれる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開発者をサポートする情報を掲載しています。