PHP: 多次元配列でarray_searchを使えるようにする関数

  • 13
    Like
  • 1
    Comment
More than 1 year has passed since last update.

1次元配列まで対応しているarray_searchを多次元配列に使えるようにする関数を作ってみました

in_arrayとarray_valuesと多次元配列についてのコチラの投稿を、参考にさせて頂いています
多次元配列でもin_arrayを使えるようにする関数をクロージャを使って実装

array_search_recursive関数
function array_search_recursive($search_element, $array)
{
    $recursive_func = function ($search_element, $array) use (&$recursive_func) {
        foreach ($array as $key => $value) {
            if(is_array($value)){
                if($recursive_func($search_element, $value) !== false) return $key;
            }
            if ($search_element == $value) return $key;
        }
        return false;
    };
    return $recursive_func($search_element, $array);
}

それでは、この関数を多次元配列に適用してみます

// 多次元配列
$array = [
    'a',
    'b',
    [
        'c',
        [
            'd',
            'e'
        ]
    ],
    'f'
];

// 適用
echo array_search_recursive('a', $array) . PHP_EOL;
echo array_search_recursive('b', $array) . PHP_EOL;
echo array_search_recursive('c', $array) . PHP_EOL;
echo array_search_recursive('d', $array) . PHP_EOL;
echo array_search_recursive('e', $array) . PHP_EOL;
echo array_search_recursive('f', $array) . PHP_EOL;
例の出力結果
/**
 * 要素が1次元目のどの要素番号にあるかを出力
 * (連想配列の場合、キー名を出力)
 */

0
1
2
2
2
3

改良点:
検索する多次元配列の要素番号を配列にして返したら、活用範囲が更に広がりそうな気がします
(例 上記の適用例の'c'を検索した場合、[2, 0]を返す)

現状では、1次元目の番号以上を求める場合、array_search_recursiveを複数回繰り返すことによって求めることになるので、オーバーヘッドがあります