PHP Tips | 文字列処理:実務向け便利系 - 配列を改行文字列に変換

PHP PHP
スポンサーリンク

なぜ「配列を改行文字列に変換」したくなるのか

さっきまでやっていた「複数行テキストを配列化」の逆方向が、
今回の「配列を改行文字列に変換」です。

例えば、こんな場面がよくあります。

  • 画面のテキストエリアに、配列の内容を「1 行ずつ」表示したい
  • DB には 1 つのテキストカラムで保存したいが、アプリ内では配列で扱いたい
  • 設定値のリストを、管理画面では複数行テキストとして編集させたい

こういうときに、

['山田太郎', '佐藤花子', '鈴木一郎']
PHP

という配列を、

山田太郎
佐藤花子
鈴木一郎

という「改行区切りの文字列」に変換するユーティリティがあると、とても扱いやすくなります。


コアとなる関数:配列 → 改行区切り文字列

一番シンプルな実装

やることはシンプルで、「配列の各要素を文字列にして、改行で implode する」です。

/**
 * 配列を改行区切りの文字列に変換する
 */
function lines_to_text(array $lines, string $eol = "\n"): string
{
    // すべて文字列にキャストしてから結合しておくと安全
    $stringLines = array_map(
        static fn($v) => (string)$v,
        $lines
    );

    return implode($eol, $stringLines);
}
PHP

使い方の例です。

$names = ['山田太郎', '佐藤花子', '鈴木一郎'];

$text = lines_to_text($names);

echo $text;
/*
山田太郎
佐藤花子
鈴木一郎
*/
PHP

ここでのポイントは 2 つです。

  • 各要素を (string) にキャストしておくことで、intfloat が混ざっていても安全に扱える
  • 改行コードを引数 $eol で変えられるようにしておくと、用途に応じて柔軟に使える

改行コードをどうするかを最初に決めておく

画面用・内部用・ファイル用で使い分ける

改行コードには主に 3 種類ありました。

  • \n … Unix 系(Linux・macOS、ブラウザのテキストエリアも基本これ)
  • \r\n … Windows 系(メモ帳など)
  • \r … ほぼ使わない

実務では、だいたい次のように決めておくと楽です。

  • アプリ内部・ブラウザのテキストエリア用 → \n
  • Windows のツールで開く前提のファイル(.txt など) → \r\n

なので、ユーティリティのデフォルトは \n にしておき、
必要に応じて "\r\n" を渡せるようにしておくのが現実的です。

$names = ['山田太郎', '佐藤花子', '鈴木一郎'];

// テキストエリア用
$textForTextarea = lines_to_text($names, "\n");

// Windows 用ファイル出力
$textForFile = lines_to_text($names, "\r\n");
PHP

例題:配列で持っている設定値をテキストエリアに表示する

ユースケースのイメージ

例えば、アプリ内では「禁止ワードリスト」を配列で持っているとします。

$ngWords = ['死ね', 'バカ', 'スパム'];
PHP

管理画面では、これをテキストエリアで編集できるようにしたい。
そのときに使うのが「配列 → 改行文字列」です。

表示側のコード例

$ngWords = ['死ね', 'バカ', 'スパム'];

$text = lines_to_text($ngWords, "\n");
?>
<textarea name="ng_words" rows="5" cols="40"><?= htmlspecialchars($text, ENT_QUOTES, 'UTF-8') ?></textarea>
PHP

テキストエリアには、こう表示されます。

死ね
バカ
スパム

ユーザーが編集して送信したら、
今度は「複数行テキストを配列化」のユーティリティで逆変換すれば OK です。

$raw = $_POST['ng_words'] ?? '';

$ngWords = text_to_non_empty_lines($raw);
// これでまた ['死ね', 'バカ', 'スパム'] のような配列に戻る
PHP

ここでの重要ポイントは、

  • 「配列 ⇔ 複数行テキスト」を行き来できるようにしておくと、
    内部ロジックと管理画面の両方がシンプルになる

ということです。


もう一歩:前後の空白や null をどう扱うか

要素のトリムを一緒にやりたい場合

配列の中に「前後に余計な空白がついた文字列」が混ざっていることもあります。
改行文字列にする前に、ついでにトリムしてしまいたい場合は、こう書けます。

/**
 * 配列を「トリム済みの改行文字列」に変換する
 */
function lines_to_trimmed_text(array $lines, string $eol = "\n"): string
{
    $stringLines = array_map(
        static fn($v) => trim((string)$v),
        $lines
    );

    return implode($eol, $stringLines);
}
PHP

null や空文字をスキップしたい場合

「意味のある行だけを出したい」場合は、フィルタも挟めます。

/**
 * null や空文字を除外してから改行文字列にする
 */
function lines_to_text_skip_empty(array $lines, string $eol = "\n"): string
{
    $result = [];

    foreach ($lines as $v) {
        $s = trim((string)$v);
        if ($s === '') {
            continue;
        }
        $result[] = $s;
    }

    return implode($eol, $result);
}
PHP

こうしておくと、「空の要素が混ざっている配列」をそのまま出力しても、
余計な空行ができずにスッキリしたテキストになります。


まとめ:今日からの「配列を改行文字列に変換」ユーティリティ

押さえておきたいポイントは、次のとおりです。

  • 配列 → 改行文字列は、「各要素を文字列化して、改行で implode」するだけ
  • 改行コードは用途に応じて \n\r\n を使い分ける
  • トリムや空要素の除外を一緒にやると、実務でさらに使いやすくなる

まずは、このシンプルな 1 本をプロジェクトに置いておくと便利です。

function lines_to_text(array $lines, string $eol = "\n"): string
{
    $stringLines = array_map(
        static fn($v) => (string)$v,
        $lines
    );

    return implode($eol, $stringLines);
}
PHP

そして、必要になったら「トリム版」「空要素スキップ版」を足していくイメージです。
もし、あなたのコードのどこかで「implode("\n", $array) をあちこちで直書きしている」なら、そこをこのユーティリティに置き換えるだけで、「改行コードの統一」と「型の扱い」が一気に整理されます。

タイトルとURLをコピーしました