【PHP実践|実務向け】PHPで複雑な多次元配列の要素を動的に削除(unset)する手法

導入

Webアプリケーション開発において、検索条件の絞り込みやフィルタリング機能を実装する際、「特定の条件のみを解除する」という要件は頻繁に発生します。特にGETパラメータで複数の条件を保持している場合、配列の階層が深くなると、特定のキーをピンポイントで削除する処理は意外と手こずるものです。本記事では、PHPで多次元配列の要素をドット記法(例: `filters.category`)で指定して安全に削除するテクニックを解説します。

基礎知識

PHPの標準関数である `unset()` は、指定した変数を破棄する際に使用しますが、多次元配列に対して「文字列のパス」を使って動的にアクセス・削除を行うことはできません。
そこで、リファレンス(参照渡し)を活用します。配列の階層をループで辿りながら参照を深く潜らせ、最終的なターゲットの親要素に対して `unset()` を実行するロジックを組むことで、柔軟な操作が可能になります。

実装/解決策

以下の実装では、`array_unset` 関数を作成し、ドットで区切られた文字列(`key1.key2.key3`)を元に、該当する配列要素を削除します。この手法を使えば、検索条件が何階層あっても共通の関数で処理が完結します。

サンプルプログラム

  • ドット記法で指定した多次元配列の要素を削除する
  • @param array $array 対象の配列
  • @param string $path ドット記法のパス (例: “options.category”)
  • @param string $separator 区切り文字
  • @return array 削除後の配列
  • /
    function array_unset($array, $path, $separator = ‘.’) {
    $keys = explode($separator, $path);
    $target = &$array; // 参照渡しで配列の階層を潜る

    // 最後のキーまで辿る
    $last_key = array_pop($keys);
    foreach ($keys as $key) {
    if (!isset($target[$key]) || !is_array($target[$key])) {
    return $array; // パスが存在しない場合は元の配列を返す
    }
    $target = &$target[$key];
    }

    // ターゲットのキーを削除
    unset($target[$last_key]);

    return $array;
    }

    // 使用例
    $params = [
    ‘keyword’ => ‘PHP’,
    ‘filters’ => [
    ‘category’ => ‘web’,
    ‘status’ => ‘active’
    ]
    ];

    // ‘filters.category’ を削除する
    $newParams = array_unset($params, ‘filters.category’);

    // 結果出力
    print_r($newParams);
    /
    出力結果:
    Array (
    [keyword] => PHP
    [filters] => Array (
    [status] => active
    )
    )
    /
    ?>

    応用・注意点

    1. 存在チェックの重要性: 存在しないパスを指定した際にエラーが発生しないよう、`isset()` や `array_key_exists()` で事前にチェックすることが重要です。上記サンプルでは参照を辿る際に安全性を確保しています。
    2. URL生成との併用: 削除した後の配列を `http_build_query()` に渡すことで、「現在の条件から特定の項目だけを外したURL」を簡単に生成できます。これにより、検索条件の「取り消しリンク」の実装が非常にスムーズになります。
    3. 型の一致: `filter_input()` などでGETパラメータを取得する際、配列として受け取るか単一の値として受け取るかによって、`array_unset` に渡すパスの構成が変わります。現場では、常に配列として扱うか、型を判定するロジックと組み合わせるのがベストプラクティスです。

    この手法を取り入れることで、複雑な条件分岐から解放され、よりクリーンで保守性の高いコードを書くことができるようになります。ぜひ実務の検索機能で活用してみてください。

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