- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
// Ищет путь до $needle в многомерном массиве $haystack
// Если задано поле $field_name, то проверяется не только значение, но и совпадение поля в котором находится значение
// Структура результата зависит от параметра tree:
// False - default, возвращается массив содержащий список корней массива, в которых встречается значение
// True - вовращается в виде дерева (исходной структуры), только с нодами которые содержат искомое значение
function recursive_array_search_all($needle, $haystack, $field_name = TRUE, $params = ['tree' => false])
{
foreach($haystack as $current_key => $value)
{
$last = (($needle == $value) && (($field_name == $current_key) || ($field_name === TRUE)));
if($last OR (is_array($value) && ($path = recursive_array_search_all($needle, $value, $field_name, [])))) {
if ($last) {
$returned[$current_key] = $value;
} else {
$returned[$current_key] = $path;
}
}
}
if(isset($params['tree']) && ($params['tree'] != true)) {
foreach($returned as $root => $arr) {
$roots[] = $root;
}
$returned = $roots;
}
if (!empty($returned))
{
return $returned;
}
return false;
}