Поиск элемента в многомерном массиве — с использованием рекурсии

#php #arrays #recursion

#php #массивы #рекурсия

Вопрос:

Я хочу написать собственную функцию поиска в многоуровневом массиве, используя рекурсию.

 $arr=[923,[123,158,12,[999,998]],111,12];
        function search($arr,$searched){
            static $position;
            static $level=0;
            foreach($arr as $k=>$v){
                if(is_array($v)){
                    $level  ;
                    search($v,$searched);
                }
                elseif($v==$searched){
                    $position[]=['level'=>$level,'key'=>$k];
                }
            }
            return dd($position);
        }
  

Результаты неверны для последних 2 элементов 111, 12. Я получаю NULL. В остальном все в порядке. Что не так?

Ответ №1:

 function search($arr,$searched){
    static $position;
    static $level=0;
    $nextLevelArray = [];
    foreach($arr as $k=>$v){ //first check only integers
        if(is_array($v)){
            $nextLevelArray[] = $v; //save array elements
        } elseif($v==$searched){ //found and save
            $position[]=['level'=>$level,'key'=>$k];
        }
    }
    if(!empty($nextLevelArray)){
        foreach($nextLevelArray as $nextLevelElement){ //check array elements and again and again...
            $level  ;
            search($nextLevelElement,$searched);
        }
    }
    return dd($position);
}
  

Ответ №2:

Я не знаю, может ли это быть полезно, но если вы хотите попробовать другой подход, вы можете написать функцию следующим образом:

     $arr=[923,[123,158,12,[999,998]],111,12];

    function array_search_recursive($arr, $searched, $index = []) {
        if (is_array($arr)) {
            $solutions = [];
            foreach ($arr as $key => $value) {
                $new_index = $index;
                array_push($new_index, $key);
                $paths = array_search_recursive($value, $searched, $new_index);
                $solutions = array_merge($solutions, $paths);
            }
            return $solutions;
        } else {
            if (is_array($searched) amp;amp; in_array($arr, $searched)) {
                return [$index];
            } else if (!is_array($searched) amp;amp; $arr === $searched) {
                return [$index];
            } else {
                return [];
            }
        }
    }

    $res = array_search_recursive($arr, [12, 999]);
    print_r($res);
  

После выполнения:

 Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
        )

    [1] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 0
        )

    [2] => Array
        (
            [0] => 3
        )

)
  

с помощью этой функции вы можете искать несколько значений и получать список путей для получения этих значений. Так, например, этот массив:

     [1] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 0
        )
  

указывает, что вы можете получить одно из желаемых значений внутри массива по:

  • индекс 1 ([123,158,12,[999,998]])
  • затем по индексу 3 ([999,998])
  • затем с индексом 0 (999).

Вы можете легко преобразовать мой формат вывода в свой.