@NickOver

Как найти один из массивов многомерного массива, по имеющемуся в нём значению?

Добрый день.
Есть многомерный массив, включающий в себя и ассоциативный и простой, с разными уровнями вложенности.
Вот его часть вывода через print_r:
многомерный массив
Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [characteristics] => Array
                        (
                            [0] => Array
                                (
                                    [Ширина предмета] => 12
                                )
                            [1] => Array
                                (
                                    [Длина] => 1100
                                )
                            [2] => Array
                                (
                                    [Материал] => Array
                                        (
                                            [0] => полиэстер
                                        )
                                )
                            [3] => Array
                                (
                                    [Изготовитель] => Array
                                        (
                                            [0] => 1403611X00
                                        )
                                )
                            [4] => Array
                                (
                                    [Группа] => Тросы
                                )
                            [5] => Array
                                (
                                    [Название] => Трос 11 метров 12 ширина
                                )
                    [sizes] => Array
                        (
                            [0] => Array
                                (
                                    [tech] => 0
                                    [ruID] => Array
                                        (
                                            [0] => 2038597018700
                                        )
                                    [ID] => 292350840
                                )
                        )
                    [dimensions] => Array
                        (
                            [width] => 21
                            [length] => 42
                            [height] => 12
                        )
                    [nmID] => 176473827
                    [objectID] => 809
                    [pro] => 
                ) 
    [1] => Array
                (
                    [characteristics] => Array
                        (
                            [0] => Array
                                (
                                    [Ширина предмета] => 15
                                )
                            [1] => Array
                                (
                                    [Длина] => 1400
                                )
                            [2] => Array
                                (
                                    [Материал] => Array
                                        (
                                            [0] => полиэстер
                                        )
                                )
                            [3] => Array
                                (
                                    [Изготовитель] => Array
                                        (
                                            [0] => 1403614X00
                                        )
                                )
                            [4] => Array
                                (
                                    [Группа] => Тросы
                                )
                            [5] => Array
                                (
                                    [Название] => Трос 11 метров 14 ширина
                                )
                        )
                    [sizes] => Array
                        (
                            [0] => Array
                                (
                                    [tech] => 0
                                    [ruID] => Array
                                        (
                                            [0] => 2038597018816
                                        )
                                    [ID] => 292350876
                                )
                        )
                    [dimensions] => Array
                        (
                            [width] => 18
                            [length] => 39
                            [height] => 12
                        )
                    [nmID] => 176473864
                    [objectID] => 809
                    [pro] => 
                )
            [2] => ….
and etc.
)


Мы знаем [ruID], значение 2038597018816. Можно ли исходя только из этого получить весь массив, в котором есть это значение? То есть на выходе получить массив [1], чтобы потом его перебрать отдельно и получить значения из него.
spoiler
[1] => Array
                (
                    [characteristics] => Array
                        (
                            [0] => Array
                                (
                                    [Ширина предмета] => 15
                                )
                            [1] => Array
                                (
                                    [Длина] => 1400
                                )
                            [2] => Array
                                (
                                    [Материал] => Array
                                        (
                                            [0] => полиэстер
                                        )
                                )
                            [3] => Array
                                (
                                    [Изготовитель] => Array
                                        (
                                            [0] => 1403614X00
                                        )
                                )
                            [4] => Array
                                (
                                    [Группа] => Тросы
                                )
                            [5] => Array
                                (
                                    [Название] => Трос 11 метров 14 ширина
                                )
                        )
                    [sizes] => Array
                        (
                            [0] => Array
                                (
                                    [tech] => 0
                                    [ruID] => Array
                                        (
                                            [0] => 2038597018816
                                        )
                                    [ID] => 292350876
                                )
                        )
                    [dimensions] => Array
                        (
                            [width] => 18
                            [length] => 39
                            [height] => 12
                        )
       [nmID] => 176473864
       [objectID] => 809
       [pro] => 
)


Если можно, то как? Прошу помочь с кодом на PHP. Пробовал варианты с array_filter, array_search, array_walk_recursive, foreach..всё не то или не могу правильно выбрать. А может и не в ту сторону смотрю.
  • Вопрос задан
  • 94 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$result = array_filter(
    $array['data'],
    fn($el) => count(array_filter(
        $el['sizes'],
        fn($size) => in_array('2038597018816', $size['ruID']),
    )) > 0,
);
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
function finder(array $arr, mixed $value): ?array {
  foreach ($arr['data'] as $subArr) {
    foreach ($subArr['sizes'] as $size) {
      if (is_array($size['ruID']) && in_array($value, $size['ruID'])) {
        return $subArr;
      }
    }
  }

  return null;
}

finder([...], 2038597018816);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы