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を複数回繰り返すことによって求めることになるので、オーバーヘッドがあります