導入
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() を併用するなどの前処理が必要です。
現場のコードでは、こうした小さなユーティリティ関数を共通化しておくことで、バグを未然に防ぎ、可読性の高いコードを維持することが可能になります。