Help us understand the problem. What is going on with this article?

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

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

yorksyo
データ系のサイトをやっています。PHP / MySQL / Linuxのサーバー関係が得意です。完全自己流なので、どんどん修行していきたいです。よろしくお願いします
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした