14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-29

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

14
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?