【PHP実践|実務向け】PHPで配列から「意図しない空要素」を安全に除去するベストプラクティス

導入

Web開発において、フォームからの入力データやAPIのレスポンスなどを処理する際、配列の中に空文字やnull、空の配列などが混入することは珍しくありません。これらを放置すると、後続の処理で予期せぬエラーが発生したり、データベースへの保存時に不整合が生じたりします。本記事では、PHPで配列から不要な要素を除去し、インデックスを再構築する実務的な手法を解説します。

基礎知識

PHPの array_filter() 関数は、配列の各要素に対してコールバック関数を実行し、戻り値が真(true)となる要素のみを抽出する関数です。
注意点として、第2引数を省略すると、PHPの「空」判定(empty)に基づき、数値の「0」や文字列の「”0″」までもが除去対象となってしまいます。実務では、「0は有効なデータとして残したい」というケースが多いため、単純なフィルタリングではなく、コールバック関数を用いた明示的な条件指定が必要です。

実装/解決策

配列から「意味のあるデータ(0を含む)」を残すには、empty() 関数の結果を反転させた上で、対象が「0」であるかを確認する論理式を組みます。また、array_filter() を実行した直後の配列はインデックスが飛び飛びになるため、配列の添字を0から振り直す必要があります。これには array_values() を使用するのが最もスマートです。

サンプルプログラム

以下のコードは、実務で頻出する「空要素の除去とインデックスの再構築」を実装した例です。

  • 配列から空要素を除去し、インデックスを詰め直す関数
  • /
    function cleanArray(array $data) {
    // 1. array_filterで空要素を除去
    // 判定条件: 値が空でない、または値が数値の0であること
    $filtered = array_filter($data, function($value) {
    return (!empty($value) || $value === 0 || $value === ‘0’);
    });

    // 2. array_valuesでインデックスを0から詰め直す
    return array_values($filtered);
    }

    // テストデータ
    $input = [‘apple’, ”, false, [], 0, null, ‘orange’, ‘0’];

    $result = cleanArray($input);

    // 結果の確認
    // array(3) { [0]=> string(5) “apple” [1]=> int(0) [2]=> string(6) “orange” [3]=> string(1) “0” }
    var_dump($result);
    ?>

    応用・注意点

    1. 連想配列への影響: array_values() を使用すると、キーが文字列の連想配列であっても、数値のインデックスに変換されてしまいます。連想配列のキーを保持したい場合は、array_merge() を使用するか、インデックスを詰め直す必要がないか再検討してください。
    2. 厳密な比較: 外部データ(JSONなど)を扱う場合、数値の0と文字列の”0″の両方が含まれることがあります。システム要件に合わせて、型比較(===)を適切に使用してください。
    3. マルチバイト文字: empty() は全角スペースを「空」と判定しません。もし全角スペースも除去対象とする場合は、trim() を併用するなどの前処理が必要です。

    現場のコードでは、こうした小さなユーティリティ関数を共通化しておくことで、バグを未然に防ぎ、可読性の高いコードを維持することが可能になります。

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