#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).
Вы можете легко преобразовать мой формат вывода в свой.