Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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 * PHPのstrtr関数の基本的な使用方法を示すサンプルコード。
5 *
6 * strtr関数は、文字列内の指定された文字を別の文字に置換します。
7 * 引数 `string $string, string $from, string $to` を使用します。
8 * `$string` 内の `$from` に含まれる各文字が、`$to` の対応する位置の文字に置換されます。
9 * 例: `$from` の最初の文字は `$to` の最初の文字に、2番目の文字は2番目の文字に置換されます。
10 * `$from` と `$to` の長さが異なる場合、短い方に合わせて置換ルールが適用されます。
11 * 例えば、$from が $to より長い場合、$to の長さに合わせて $from が切り詰められ、
12 * その範囲内でしか置換が行われません。
13 *
14 * システムエンジニアを目指す初心者向けに、簡潔で分かりやすい例を提供します。
15 */
16function demonstrateStrtr(): void
17{
18    // 置換処理を行う元の文字列を定義します。
19    $originalString = "Hello, world! This is a PHP example. 日本語も試してみます。";
20
21    echo "元の文字列: " . $originalString . PHP_EOL . PHP_EOL;
22
23    // --- 例1: 複数の文字を別の文字に置換 ---
24    // 'H' を 'J' に、'e' を 'a' に、'o' を 'u' に置換します。
25    $from1 = "Heo";
26    $to1 = "Jau";
27    $result1 = strtr($originalString, $from1, $to1);
28    echo "--- 例1: 複数の文字を別の文字に置換 ---" . PHP_EOL;
29    echo "置換ルール: '" . $from1 . "' を '" . $to1 . "' に置換" . PHP_EOL;
30    echo "結果: " . $result1 . PHP_EOL . PHP_EOL;
31
32    // --- 例2: 大文字小文字の変換 (特定の文字) ---
33    // 文中の母音 'a', 'e', 'i', 'o', 'u' をそれぞれ大文字に置換します。
34    $from2 = "aeiou";
35    $to2 = "AEIOU";
36    $result2 = strtr($originalString, $from2, $to2);
37    echo "--- 例2: 大文字小文字の変換 (特定の文字) ---" . PHP_EOL;
38    echo "置換ルール: '" . $from2 . "' を '" . $to2 . "' に置換" . PHP_EOL;
39    echo "結果: " . $result2 . PHP_EOL . PHP_EOL;
40
41    // --- 例3: 日本語文字列での置換 ---
42    // "日本"という文字列中の '' と '' をそれぞれ '' と '' に置換します。
43    // strtrはバイト単位で処理を行いますが、この例のように単一の全角文字を
44    // 別の単一の全角文字に置換する場合には正しく動作します。
45    $from3 = "日本";
46    $to3 = "世界";
47    $result3 = strtr($originalString, $from3, $to3);
48    echo "--- 例3: 日本語文字列での置換 ---" . PHP_EOL;
49    echo "置換ルール: '" . $from3 . "' を '" . $to3 . "' に置換" . PHP_EOL;
50    echo "結果: " . $result3 . PHP_EOL . PHP_EOL;
51
52    // --- 例4: $from と $to の長さが異なる場合 ---
53    // $from の方が $to より長い場合、$to の長さに合わせて $from が切り詰められます。
54    // この場合、'P' は 'p' に置換されますが、'H' に対応する $to の文字がないため 'H' は置換されません。
55    $string4 = "PHP is Fun";
56    $from4 = "PH";
57    $to4 = "p";
58    $result4 = strtr($string4, $from4, $to4);
59    echo "--- 例4: \$from と \$to の長さが異なる場合 ---" . PHP_EOL;
60    echo "元の文字列: " . $string4 . PHP_EOL;
61    echo "置換ルール: '" . $from4 . "' を '" . $to4 . "' に置換" . PHP_EOL;
62    echo "結果: " . $result4 . PHP_EOL . PHP_EOL;
63}
64
65// 関数を実行し、サンプルコードの動作を確認します。
66demonstrateStrtr();
67
68?>

PHPのstrtr関数は、文字列に含まれる特定の文字を別の文字に一括で置換するために使用される、非常に便利な関数です。

この関数は、主に3つの引数を取ります。最初のstring $stringは置換の対象となる元の文字列、2番目のstring $fromは置換したい文字の集合、そして3番目のstring $to$fromに対応して置き換えられる文字の集合を指定します。

strtr関数は、$stringの中から$fromに含まれる各文字を見つけ出し、それを$toの対応する位置の文字に置き換えます。例えば、$fromの最初の文字が見つかると$toの最初の文字に、2番目の文字が見つかると$toの2番目の文字に置換されます。

$from$toの長さが異なる場合、短い方の文字列の長さに合わせて置換ルールが適用されます。もし$from$toより長い場合、$toの長さに合わせて$fromが切り詰められ、対応する範囲の文字のみが置換されます。

日本語のようなマルチバイト文字を含む文字列でも使用できますが、strtr関数は内部的にバイト単位で処理を行います。そのため、単一の全角文字を別の単一の全角文字に置換するようなケースでは期待通りに動作しますが、より複雑なマルチバイト文字の置換では注意が必要です。

この関数の戻り値は、置換処理が完了した後の新しい文字列です。複数の異なる文字を同時に、かつ効率的に置換したい場合にこの関数は特に役立ちます。

PHPのstrtr関数は、指定した文字列内で特定の「文字」を別の「文字」へ1対1で置換します。引数$from$toの長さが異なる場合、短い方に合わせて置換ルールが適用される点にご留意ください。特に$from$toより長い場合は、$toの長さ以上の$fromの文字は置換対象になりません。日本語などのマルチバイト文字を扱う際、strtrはバイト単位で処理するため、意図しない結果になる可能性があります。単一の全角文字置換には使えますが、より複雑なマルチバイト文字列の置換には適していません。大文字と小文字は区別されるため、置換対象の文字と完全に一致するよう指定してください。

PHP strtrで複数置換する

1<?php
2
3/**
4 * strtr関数を使って、文字列内の複数箇所を配列定義に基づいて一括置換する関数。
5 *
6 * strtr関数は、文字列の一部を別の文字列に置換するのに使われます。
7 * 第二引数に連想配列を渡すと、配列のキー(置換対象)が対応する値(置換後)に置き換えられます。
8 * この際、より長いキーがより短いキーよりも先に評価されるため、
9 * 例えば「apple」と「apple pie」の両方を置換対象とする場合、「apple pie」が優先して処理されます。
10 *
11 * @param string $originalString 置換を実行する元の文字列。
12 * @return string 置換が適用された新しい文字列。
13 */
14function replaceMultipleTerms(string $originalString): string
15{
16    // 置換ルールを定義する連想配列です。
17    // キーが元の文字列(置換される部分)、値が新しい文字列(置換後の部分)です。
18    $replacementPairs = [
19        "apple"  => "りんご",
20        "banana" => "バナナ",
21        "orange" => "オレンジ",
22        "fruit"  => "果物",
23        "like"   => "好き",
24        "These"  => "これら",
25        "delicious" => "美味しい",
26    ];
27
28    // strtr関数を使って、定義された置換ルールに基づいて文字列を置換します。
29    // 第二引数に配列を渡すことで、複数の置換を一回の関数呼び出しで効率的に行えます。
30    $transformedString = strtr($originalString, $replacementPairs);
31
32    return $transformedString;
33}
34
35// --- サンプルコードの実行 ---
36
37// 置換を適用する元の文章
38$sentence = "I like apple, banana, and orange. These are delicious fruit.";
39
40// 関数を呼び出し、文字列の置換を実行
41$result = replaceMultipleTerms($sentence);
42
43// 結果を出力して確認
44echo "元の文字列: " . $sentence . PHP_EOL;
45echo "置換後の文字列: " . $result . PHP_EOL;
46
47?>

PHPのstrtr関数は、文字列中の特定部分を別の文字列に置換するために使われます。PHP 8で、第二引数に連想配列を渡すことで、複数の置換ルールに基づいた一括置換を効率的に実行できる点が特徴です。

引数$stringには置換対象の元の文字列を指定します。第二引数$fromには、連想配列形式で置換ルールを定義します。キーが置換対象、値が置換後文字列です。この配列形式を用いる場合、第三引数$toは不要です。strtr関数は、これらのルールを適用した新しい文字列を戻り値として返します。元の文字列は変更されません。

重要な挙動として、置換対象のキーが複数ある場合、より長いキーが短いキーよりも優先して評価されます。例えば「apple pie」と「apple」というキーがある場合、「apple pie」が先に処理され、意図しない部分置換を防ぐことができます。

サンプルコードでは、replaceMultipleTerms関数内でstrtr関数を活用し、英語の単語群を日本語に一括で置き換える例を示しています。このように、strtr関数は複雑な文字列変換処理を簡潔に記述でき、システム開発におけるテキスト処理に役立ちます。

strtr関数は、第二引数に連想配列を渡すことで、複数の文字列を一括で効率的に置換できます。この機能を使う際、最も長いキー(置換対象)が優先して処理されるため、「apple pie」と「apple」のような重複するキーがある場合でも、意図しない部分的な置換が起こりにくいという利点があります。また、strtrはデフォルトで大文字と小文字を区別して置換されるため、もし区別しない置換が必要な場合は、事前に文字列を統一する処理を検討してください。一度置換された部分は、そのstrtr関数の実行中に再度別の置換ルールの対象にはなりませんので、連鎖的な置換による予期せぬ結果を防ぎ、安全に利用できるのが特徴です。

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 $stringstring $fromstring $toを引数にとり、$string内の$fromに含まれる各文字を$toの対応する文字に一対一で変換し、変換後の文字列を返します。この関数は元の文字列に対して一度に変換を行うため、ある文字の変換結果が後続の文字の変換に影響を与えることはありません。サンプルコードでは、「apple and banana」の'a'を'x'、'p'を'q'に変換すると、「xqqle xnd bxnxnx」という結果が得られています。

一方、str_replace関数は、string|array $searchstring|array $replacestring|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の連鎖置換による影響には特に注意してください。

関連コンテンツ

関連プログラミング言語