【PHP8.x】strtr()関数の使い方
strtr関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
strtr関数は、指定された文字列中の文字または部分文字列を、別の文字または部分文字列に置換する関数です。この関数は、主に二つの異なる方法で文字列の置換を実行できます。
第一に、三つの引数を受け取る形式では、対象となる元の文字列、置換元の文字集合、そして置換先の文字集合を指定します。例えば、「abracadabra」という文字列中の「a」を「x」に、「b」を「y」に置き換えたい場合、置換元の文字集合に「ab」、置換先の文字集合に「xy」を指定することで、元の文字列内の各「a」が「x」に、各「b」が「y」に変換されます。この形式は、文字単位での一括変換を効率的に行いたい場合に特に有用です。
第二に、二つの引数を受け取る形式では、対象となる元の文字列と、置換元と置換先のペアをキーと値として持つ連想配列を指定します。この形式では、置換元として任意の長さの部分文字列を指定できるため、特定の単語やフレーズを別の単語やフレーズに置き換えることが可能です。この連想配列を用いた置換では、連想配列のキー(置換元)が長いものから順に処理されるという重要な特性があります。これにより、「apple」と「applepie」のような関連する部分文字列がある場合でも、「applepie」が先に置換され、意図しない部分置換を防ぐことができます。
strtr関数は、テキストデータの整形、特定の記号の変換、ユーザー入力のサニタイズなど、幅広いシナリオで文字列処理を簡潔かつ効率的に行うために利用されます。特に、多数の異なる文字や部分文字列を一度に置換する必要がある場合に、その利便性を発揮します。
構文(syntax)
1<?php 2$originalString = "Hello PHP World"; 3$replacements = [ 4 "Hello" => "こんにちは", 5 "World" => "世界" 6]; 7$translatedString = strtr($originalString, $replacements); 8echo $translatedString; 9?>
引数(parameters)
string $string, string $from, string $to
- string $string: 置換対象の文字列
- string $from: 置換される文字を指定する文字列
- string $to: 置換後の文字を指定する文字列
戻り値(return)
string
指定された文字列内で、指定された検索文字列を置換した結果の文字列が返されます。
サンプルコード
PHP strtr 関数で文字列置換する
1<?php 2 3/** 4 * strtr() 関数の基本的な使用例 5 * 6 * strtr() 関数は、指定された文字列内の特定の文字を別の文字に置換します。 7 * $from に含まれる各文字は、$to の対応する位置にある文字に置換されます。 8 * $from と $to の文字列の長さは同じである必要があります。 9 */ 10 11// 変換対象の元の文字列 12$originalString = "Hello PHP 8!"; 13 14// 置換元の文字をまとめた文字列 (例: 'H' 'e' 'l' 'o' 'P') 15$fromChars = "HeloP"; 16// 置換先の文字をまとめた文字列 (例: 'J' 'a' 'v' 'e' 'Q') 17// fromChars と同じ長さで、各文字が fromChars の対応する文字と置き換えられます 18$toChars = "JaveQ"; 19 20// strtr() 関数を使って文字列内の文字を置換します 21$translatedString = strtr($originalString, $fromChars, $toChars); 22 23echo "元の文字列: " . $originalString . PHP_EOL; 24echo "置換後の文字列: " . $translatedString . PHP_EOL; 25 26/* 27上記の例では、以下の置換が行われます: 28'H' -> 'J' 29'e' -> 'a' 30'l' -> 'v' (文字列中のすべての 'l' が対象) 31'o' -> 'e' 32'P' -> 'Q' 33*/ 34 35// 別の例: 数字の置換 36$numberString = "123-ABC-456"; 37$fromNumbers = "123456"; 38$toNumbers = "ABCDEF"; // 各数字を対応する文字に置換 39 40$replacedNumbers = strtr($numberString, $fromNumbers, $toNumbers); 41 42echo PHP_EOL; // 出力の区切り 43echo "元の数字文字列: " . $numberString . PHP_EOL; 44echo "置換後の数字文字列: " . $replacedNumbers . PHP_EOL; 45 46/* 47この例では、以下の置換が行われます: 48'1' -> 'A' 49'2' -> 'B' 50'3' -> 'C' 51'-' は fromNumbers に含まれていないため、そのままです。 52'4' -> 'D' 53'5' -> 'E' 54'6' -> 'F' 55*/
PHPのstrtr関数は、指定した文字列中の特定の文字を別の文字に一括で置換するために使用します。この関数は3つの引数を取ります。
第1引数 $string には、文字を置換したい元の文字列を指定します。
第2引数 $from には、置換したい元の文字をまとめた文字列を指定します。
第3引数 $to には、$from に対応する置換後の文字をまとめた文字列を指定します。
ここで重要なのは、$from と $to の文字列の長さが必ず同じでなければならない点です。$fromの1文字目が$toの1文字目に、$fromの2文字目が$toの2文字目に対応し、それぞれ置換が行われます。
戻り値は、置換後の新しい文字列です。元の文字列は変更されません。
例えば、"Hello PHP 8!" という文字列で'H'を'J'に、'e'を'a'に、'l'を'v'に、'o'を'e'に、'P'を'Q'に置換したい場合、strtr("Hello PHP 8!", "HeloP", "JaveQ")と記述します。これにより、元の文字列は"Javve QHP 8!"に変換されます。
また、"123-ABC-456" のような文字列中の数字を別の文字に置換する際にも利用できます。例えば、'1'を'A'、'2'を'B'、'3'を'C'、'4'を'D'、'5'を'E'、'6'を'F'に置換したい場合は、strtr("123-ABC-456", "123456", "ABCDEF")のように記述し、結果として"ABC-ABC-DEF"が得られます。$fromに含まれていないハイフンなどの文字は、置換されずにそのまま残ります。この関数は、複数の文字を同時に、かつ効率的に変換したい場合に非常に役立ちます。
strtr()関数を使用する際は、第二引数と第三引数の文字列($fromと$to)の長さを必ず同じにしてください。長さが異なると、置換が正しく行われない可能性があります。置換されるのは$fromに含まれる文字のみで、元の文字列内で$fromに含まれない文字はそのまま残ります。また、大文字と小文字は区別されますので、「a」と「A」は異なる文字として扱われる点にご注意ください。日本語などのマルチバイト文字の置換にはこの関数は向いておらず、文字化けや予期せぬ結果を招くことがあります。マルチバイト文字を安全に置換したい場合は、mb_ereg_replaceなどのマルチバイト対応関数を検討してください。
PHP: strtrとstr_replaceの置換を比較する
1<?php 2 3/** 4 * PHPのstrtr関数とstr_replace関数の違いを比較するサンプルコード。 5 * 6 * strtr は文字単位での一対一の変換に適しており、変換結果が次の変換に影響を与えません。 7 * str_replace は文字列(部分文字列)単位での置換に適しており、 8 * 複数の置換ルールを配列で指定した場合、前の置換結果が後の置換に影響を与える可能性があります。 9 */ 10function compareStringReplacementFunctions(): void 11{ 12 // 比較に使用する元の文字列 13 $originalString = "apple and banana"; 14 echo "元の文字列: " . $originalString . PHP_EOL; 15 echo "----------------------------------------" . PHP_EOL; 16 17 // --- strtr の使用例 --- 18 // strtr(string $string, string $from, string $to) 19 // $from の各文字を $to の対応する文字に一対一で変換します。 20 // 変換は元の文字列の文字に対して一度に行われ、結果が後の変換に影響しません。 21 echo "strtr の例: 文字単位の一対一変換" . PHP_EOL; 22 23 // 例1: 'a' を 'x' に、'p' を 'q' に変換する 24 // 元の文字列の各 'a' は 'x' に、各 'p' は 'q' に変換されます。 25 // 例えば 'pp' は 'qq' になります。 26 $fromChars = "ap"; 27 $toChars = "xq"; 28 $resultStrtrCharMap = strtr($originalString, $fromChars, $toChars); 29 echo " 'a'->'x', 'p'->'q' の場合: " . $resultStrtrCharMap . PHP_EOL; 30 // 期待される結果: xqqle xnd bxnxnx 31 32 echo "----------------------------------------" . PHP_EOL; 33 34 // --- str_replace の使用例 --- 35 // str_replace(string|array $search, string|array $replace, string|array $subject) 36 // $subject 内の $search を $replace に置き換えます。 37 // 複数の置換ルールを配列で指定した場合、リストの順に置換が適用され、 38 // 前の置換結果が後の置換に影響を与える可能性があります(連鎖置換)。 39 echo "str_replace の例: 文字列単位の置換と、連鎖的な影響" . PHP_EOL; 40 41 // 例2: 単一の文字列置換 42 // 'apple' という部分文字列を 'orange' に置き換えます。 43 $searchSingle = "apple"; 44 $replaceSingle = "orange"; 45 $resultStrReplaceSingle = str_replace($searchSingle, $replaceSingle, $originalString); 46 echo " 'apple'->'orange' の場合: " . $resultStrReplaceSingle . PHP_EOL; 47 // 期待される結果: orange and banana 48 49 // 例3: 複数の文字列置換(配列指定)と連鎖置換の影響 50 // 'a' を 'x' に、その後 'x' を 'y' に置換する例。 51 // str_replace では、最初の置換で生成された 'x' が、次の置換ルールによってさらに 'y' に変わります。 52 $searchMultiple = ['a', 'x']; 53 $replaceMultiple = ['x', 'y']; 54 $chainedString = "banana"; // 連鎖置換の影響を見やすくするため、短い文字列で試します 55 echo " 元の文字列 (連鎖置換のテスト): " . $chainedString . PHP_EOL; 56 $resultStrReplaceChained = str_replace($searchMultiple, $replaceMultiple, $chainedString); 57 echo " str_replace(['a', 'x'], ['x', 'y']) の結果: " . $resultStrReplaceChained . PHP_EOL; 58 // 期待される結果: 'banana' -> ('a'->'x') -> 'bxnxnx' -> ('x'->'y') -> 'bynyny' 59 60 // 例4: 同じ置換を strtr で行った場合(連鎖置換されない) 61 // strtr は元の文字列に対して一斉に置換を行うため、 62 // マッピング 'x' -> 'y' は元の文字列 "banana" に 'x' が存在しないため適用されません。 63 $resultStrtrChained = strtr($chainedString, "ax", "xy"); 64 echo " strtr(\"{$chainedString}\", \"ax\", \"xy\") の結果: " . $resultStrtrChained . PHP_EOL; 65 // 期待される結果: 'banana' -> ('a'->'x') -> 'bxnxnx' 66 67 echo "----------------------------------------" . PHP_EOL; 68 echo "まとめ:" . PHP_EOL; 69 echo " - strtr は文字単位の一対一変換に優れ、変換は独立して行われます。" . PHP_EOL; 70 echo " - str_replace は文字列単位の置換に優れ、複数の置換ルールは連鎖的に影響することがあります。" . PHP_EOL; 71 echo " 用途や期待する置換ロジックに応じて、適切な関数を選択することが重要です。" . PHP_EOL; 72} 73 74// 関数を実行して結果を出力 75compareStringReplacementFunctions();
このPHPサンプルコードは、文字列の置換を行うstrtr関数とstr_replace関数の機能と挙動の違いを比較して解説しています。
strtr関数は、string $string、string $from、string $toを引数にとり、$string内の$fromに含まれる各文字を$toの対応する文字に一対一で変換し、変換後の文字列を返します。この関数は元の文字列に対して一度に変換を行うため、ある文字の変換結果が後続の文字の変換に影響を与えることはありません。サンプルコードでは、「apple and banana」の'a'を'x'、'p'を'q'に変換すると、「xqqle xnd bxnxnx」という結果が得られています。
一方、str_replace関数は、string|array $search、string|array $replace、string|array $subjectを引数にとり、$subject内の$search文字列を$replace文字列に置き換え、置換後の文字列または配列を返します。この関数は文字列単位の置換に適しており、複数の置換ルールを配列で指定した場合、リストの順に置換が適用されます。そのため、最初の置換で生成された文字列が、次の置換ルールの対象となり、さらに変換される「連鎖置換」が発生する可能性があります。サンプルコードでは、「banana」の'a'を'x'、その後'x'を'y'に置換する際に、str_replaceでは「bynyny」と連鎖的に変換されますが、strtrでは連鎖置換は発生せず「bxnxnx」となります。
したがって、文字単位で独立した変換を行いたい場合はstrtrを、文字列単位の置換や、連鎖的な変換を意図する場合はstr_replaceを選択するなど、それぞれの特性を理解して適切に使い分けることが重要です。
strtr関数は、元の文字列の各文字を対応する別の文字に一対一で変換します。この変換は一度に、独立して行われるため、ある変換で新しく生成された文字が、続けて別の変換の対象となることはありません。
一方、str_replace関数は、指定された部分文字列を別の部分文字列に置き換えます。複数の置換ルールを配列で指定した場合、ルールは順番に適用されるため、最初の置換で生成された文字列が、次の置換ルールの対象となり、意図しない連鎖的な置換が発生する可能性があります。
したがって、文字単位の単純な変換にはstrtrが適しており、部分文字列の置換で連鎖置換の挙動を理解している、または許容できる場合にstr_replaceを選択することが、安全かつ正しいコード利用のために重要です。目的に応じて適切な関数を選び、str_replaceの連鎖置換による影響には特に注意してください。