PHPで配列と文字列を変換する方法について

採用はこちら

PHPでは、配列を文字列へ変換したり、文字列を配列へ変換したりする処理をよく行います。

代表的な方法は、配列から文字列へ変換する implode() と、文字列から配列へ変換する explode() です。

単純な区切り文字による変換であれば、この2つの関数で対応できます。

一方、連想配列や多次元配列の構造を保持したまま文字列へ変換したい場合は、json_encode()json_decode() を使う方法が適しています。

用途に応じて関数を使い分けることが重要です。

目次

PHPで配列を文字列に変換する方法

implode()を使う

PHPで配列を文字列に変換するときに、もっとも基本的なのが implode() 関数です。

implode() は、配列の各要素を指定した区切り文字で連結し、1つの文字列として返します。

基本的な書き方は次のとおりです。

implode(string $separator, array $array): string

例えば、次の配列をカンマ区切りの文字列に変換してみます。

$fruits = ['apple', 'banana', 'orange'];

$result = implode(',', $fruits);

echo $result;

実行結果は次のとおりです。

apple,banana,orange

このように、配列の各値が指定した区切り文字で連結されます。

カンマと半角スペースで連結する

画面に表示する文字列では、カンマだけではなく、カンマの後ろに半角スペースを入れると読みやすくなります。

$fruits = ['apple', 'banana', 'orange'];

$result = implode(', ', $fruits);

echo $result;

実行結果は次のとおりです。

apple, banana, orange

改行区切りの文字列に変換する

配列の各要素を1行ずつ表示したい場合は、改行文字を区切り文字として指定できます。

$items = ['PHP', 'JavaScript', 'Python'];

$result = implode("\n", $items);

echo $result;

実行結果は次のようになります。

PHP
JavaScript
Python

HTML上で改行したい場合は、<br> を区切り文字にする方法もあります。

$items = ['PHP', 'JavaScript', 'Python'];

echo implode('<br>', $items);

ただし、ユーザー入力などの外部データをHTMLへ表示する場合は、XSS対策として htmlspecialchars() などによるエスケープ処理が必要です。

例えば、次のように各要素をエスケープしてから連結できます。

$safeItems = array_map(
    fn($item) => htmlspecialchars(
        $item,
        ENT_QUOTES | ENT_SUBSTITUTE,
        'UTF-8'
    ),
    $items
);

echo implode('<br>', $safeItems);

連想配列をimplode()するとキーは含まれない

implode() は、配列のキーではなく値を連結します。

例えば、次の連想配列があります。

$data = [
    'name' => 'Taro',
    'age' => '30'
];

echo implode(',', $data);

実行結果は次のようになります。

Taro,30

nameage といったキーは文字列に含まれません。

キーと値の両方を保存したい場合は、JSONを利用する方法が適しています。

PHPで文字列を配列に変換する方法

explode()を使う

文字列を特定の区切り文字で分割して配列へ変換するときは、explode() 関数を使用します。

基本的な書き方は次のとおりです。

explode(
    string $separator,
    string $string,
    int $limit = PHP_INT_MAX
): array

例えば、カンマ区切りの文字列を配列へ変換してみます。

$string = 'apple,banana,orange';

$fruits = explode(',', $string);

print_r($fruits);

実行結果は次のとおりです。

Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)

このように、指定した区切り文字を境界として文字列が分割されます。

空白を削除して配列に変換する

次のような文字列を考えてみます。

$string = 'apple, banana, orange';

カンマだけで分割すると、2番目以降の要素の先頭にスペースが残ります。

$array = explode(',', $string);

結果は次のようになります。

apple
 banana
 orange

このような場合は、trim()array_map() を組み合わせる方法が便利です。

$string = 'apple, banana, orange';

$array = array_map(
    'trim',
    explode(',', $string)
);

print_r($array);

実行結果は次のようになります。

Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)

入力データのスペースの有無が統一されていない場合でも扱いやすい方法です。

explode()の区切り文字に空文字列は指定できない

PHP 8.0以降では、explode() の区切り文字に空文字列を指定すると ValueError が発生します。

次のような書き方はできません。

$array = explode('', 'abcdef');

文字列を1文字ずつ分割したい場合は、str_split()mb_str_split() を使用します。

implode()とexplode()を組み合わせる方法

配列を文字列にしてから配列へ戻す

implode()explode() は、逆方向の処理を行う関数として組み合わせて使用できます。

例えば、次の配列があります。

$array = ['red', 'green', 'blue'];

まず、implode() で文字列に変換します。

$string = implode(',', $array);

echo $string;

実行結果は次のとおりです。

red,green,blue

続いて、explode() で配列へ戻します。

$array2 = explode(',', $string);

print_r($array2);

結果は次のようになります。

Array
(
    [0] => red
    [1] => green
    [2] => blue
)

区切り文字が値に含まれる場合は注意する

implode()explode() を使えば簡単に変換できますが、必ず元の配列を完全に復元できるとは限りません。

例えば、次の配列を考えてみます。

$array = [
    'Tokyo, Japan',
    'Osaka, Japan'
];

これをカンマで連結すると、次のようになります。

$string = implode(',', $array);

echo $string;
Tokyo, Japan,Osaka, Japan

これを再びカンマで分割すると、次のようになります。

$array = explode(',', $string);

print_r($array);
Array
(
    [0] => Tokyo
    [1] =>  Japan
    [2] => Osaka
    [3] =>  Japan
)

本来2つだった要素が4つに分かれてしまいます。

そのため、値の中に区切り文字が含まれる可能性がある場合は、JSONなど別の形式を利用する方が安全です。

連想配列を文字列に変換する方法

json_encode()を使う

連想配列や多次元配列を、構造を保持したまま文字列へ変換したい場合は json_encode() が便利です。

例えば、次の連想配列があります。

$user = [
    'name' => 'Taro',
    'age' => 30,
    'city' => 'Tokyo'
];

これをJSON文字列へ変換します。

$json = json_encode($user);

echo $json;

実行結果は次のようになります。

{"name":"Taro","age":30,"city":"Tokyo"}

キーと値の両方を保持できるため、単純な implode() よりも複雑なデータを扱いやすくなります。

日本語をそのままJSONに出力する

日本語を含むデータを読みやすいJSON形式で出力したい場合は、JSON_UNESCAPED_UNICODE を指定できます。

$data = [
    'name' => '山田太郎',
    'city' => '東京'
];

$json = json_encode(
    $data,
    JSON_UNESCAPED_UNICODE
);

echo $json;

結果は次のようになります。

{"name":"山田太郎","city":"東京"}

日本語がUnicodeエスケープされないため、人間が確認しやすいJSONになります。

json_encode()のエラー処理も考慮する

json_encode() は、変換に失敗すると false を返す場合があります。

実務では、JSON_THROW_ON_ERROR を指定して例外としてエラーを処理する方法もあります。

try {
    $json = json_encode(
        $data,
        JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR
    );

    echo $json;
} catch (JsonException $e) {
    echo 'JSON変換に失敗しました。';
}

エラーを明示的に処理できるため、JSON変換の失敗を見落としにくくなります。

JSON文字列を配列に変換する方法

json_decode()を使う

JSON文字列をPHPの配列へ戻す場合は、json_decode() を使用します。

例えば、次のJSON文字列があります。

$json = '{"name":"Taro","age":30,"city":"Tokyo"}';

第2引数に true を指定すると、連想配列として取得できます。

$data = json_decode($json, true);

print_r($data);

実行結果は次のとおりです。

Array
(
    [name] => Taro
    [age] => 30
    [city] => Tokyo
)

第2引数を省略するとオブジェクトとして扱われる

次のように第2引数を指定しない場合、JSONオブジェクトは通常PHPのオブジェクトとして取得されます。

$data = json_decode($json);

値へのアクセス方法は次のようになります。

echo $data->name;

一方、配列として扱いたい場合は次のようにします。

$data = json_decode($json, true);

echo $data['name'];

JSONのデコードでも例外処理ができる

json_decode() でも JSON_THROW_ON_ERROR を利用できます。

try {
    $data = json_decode(
        $json,
        true,
        512,
        JSON_THROW_ON_ERROR
    );

    print_r($data);
} catch (JsonException $e) {
    echo 'JSONの解析に失敗しました。';
}

不正なJSONが入力された場合でも、エラーを明確に検出できます。

なお、json_decode() で扱うJSON文字列はUTF-8である必要があります。

多次元配列を文字列に変換する方法

多次元配列にはJSONを利用する

多次元配列は、implode() だけでは構造を保ったまま文字列化できません。

そのため、JSONを利用する方法が適しています。

例えば、次の多次元配列があります。

$users = [
    [
        'name' => 'Taro',
        'age' => 30
    ],
    [
        'name' => 'Hanako',
        'age' => 25
    ]
];

JSONへ変換します。

$json = json_encode(
    $users,
    JSON_UNESCAPED_UNICODE
);

echo $json;

結果は次のようになります。

[{"name":"Taro","age":30},{"name":"Hanako","age":25}]

元の配列へ戻す場合は、次のようにします。

$users = json_decode($json, true);

JSONを使えば、ネストされた配列でも構造を維持したまま保存・復元できます。

文字列を1文字ずつ配列に変換する方法

英数字ならstr_split()を使う

文字列を一定の長さごとに分割したい場合は str_split() が利用できます。

例えば、英字を1文字ずつ分割する場合は次のようにします。

$string = 'abcdef';

$array = str_split($string);

print_r($array);

実行結果は次のとおりです。

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
)

2バイトずつではなく、指定したバイト長ごとに分割することもできます。

$string = 'abcdef';

$array = str_split($string, 2);

print_r($array);

結果は次のようになります。

Array
(
    [0] => ab
    [1] => cd
    [2] => ef
)

日本語にはmb_str_split()を使う

str_split() は文字単位ではなくバイト単位で処理します。

そのため、日本語のようなマルチバイト文字列を1文字ずつ分割する用途には適していません。

日本語を扱う場合は mb_str_split() を利用できます。

$string = '東京都';

$array = mb_str_split($string);

print_r($array);

実行結果は次のようになります。

Array
(
    [0] => 東
    [1] => 京
    [2] => 都
)

日本語や中国語などのマルチバイト文字列を文字単位で分割する場合は、mb_str_split() を利用するのが適切です。

複雑な条件で文字列を配列に変換する方法

preg_split()を使う

複数種類の区切り文字を扱いたい場合は、preg_split() が便利です。

例えば、「カンマまたは空白」で文字列を分割する場合は次のようにします。

$string = 'apple,banana orange';

$array = preg_split('/[,\s]+/', $string);

print_r($array);

実行結果は次のとおりです。

Array
(
    [0] => apple
    [1] => banana
    [2] => orange
)

正規表現を利用できるため、複雑なルールで文字列を分割できます。

ただし、単純な固定文字列で分割するだけなら、preg_split() より explode() の方がコードが分かりやすくなります。

serialize()で配列を文字列に変換する方法

serialize()とunserialize()を使う

PHPには、データ構造を文字列として保存するための serialize() もあります。

例えば、次の配列があります。

$data = [
    'name' => 'Taro',
    'age' => 30
];

serialize() で文字列へ変換できます。

$string = serialize($data);

echo $string;

復元する場合は unserialize() を利用します。

$data = unserialize($string);

print_r($data);

PHPの型や構造を保持したまま保存・復元できる方法です。

信頼できないデータをunserialize()しない

unserialize() を利用する際は、セキュリティに注意が必要です。

ユーザー入力や外部サービスから取得した信頼できないデータを、そのまま unserialize() へ渡すことは避けるべきです。

例えば、次のような使い方は適切ではありません。

$data = unserialize($_POST['data']);

保存形式を自由に選べる場合は、JSONを利用した方が安全で扱いやすいケースが多くあります。

PHPで配列と文字列を変換するときの使い分け

単純な一次元配列ならimplode()とexplode()

単純な配列をカンマ区切りなどの文字列にしたい場合は、implode() が適しています。

反対に、区切り文字を使って文字列を配列へ変換したい場合は、explode() を利用します。

例えば、タグや簡単な設定値などで使いやすい方法です。

連想配列や多次元配列ならJSON

キーを持つ連想配列や、複数階層からなる多次元配列では、JSONを利用するのが分かりやすい方法です。

配列からJSONへは json_encode()、JSONから配列へは json_decode($json, true) を利用できます。

API通信やデータ保存など、PHP以外のシステムとデータをやり取りする場合にもJSONは広く利用されています。

日本語文字列の分割にはmb_str_split()

英数字を分割するだけなら str_split() が利用できます。

一方、日本語のようなマルチバイト文字列を1文字ずつ分割する場合は mb_str_split() を利用します。

文字コードを扱う処理では、バイトと文字の違いを意識することが重要です。

PHPの配列と文字列の変換方法まとめ

PHPで配列と文字列を変換する方法は、目的によって異なります。

主な使い分けは次のとおりです。

やりたいこと使用する主な関数
配列を区切り文字付きの文字列にするimplode()
区切り文字で文字列を配列にするexplode()
配列をJSON文字列にするjson_encode()
JSON文字列を配列にするjson_decode($json, true)
英数字を一定のバイト長で分割するstr_split()
日本語を文字単位で分割するmb_str_split()
正規表現で文字列を分割するpreg_split()
PHPの値をシリアライズするserialize()
シリアライズされた値を復元するunserialize()

単純な一次元配列であれば、implode()explode() を使うのが基本です。

一方、連想配列や多次元配列を扱う場合は、データ構造を維持できる json_encode()json_decode() が適しています。

また、文字列を1文字ずつ分割する場合は、英数字なら str_split()、日本語などのマルチバイト文字列なら mb_str_split() と使い分けることが大切です。

それぞれの関数の特徴を理解しておけば、PHPで配列と文字列を安全かつ効率的に変換できます。

以上、PHPで配列と文字列を変換する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次