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

Ссылка скопирована
1 ответ

Добрый день.
Есть многомерный массив, включающий в себя и ассоциативный и простой, с разными уровнями вложенности.
Вот его часть вывода через 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. )

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] =>  )

[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..всё не то или не могу правильно выбрать. А может и не в ту сторону смотрю.

Дополнительно:

Ну хоть общая-то структура у данных неизменная? Мы знаем, что искать нужно именно в sizes?

  • Алексей Уколов, Да, sizes всегда присутствует и в нём располагается ruID.
  • $result = array_filter(     $array['data'],     fn($el) => count(array_filter(         $el['sizes'],         fn($size) => in_array('2038597018816', $size['ruID']),     )) > 0, );

    $result = array_filter( $array['data'], fn($el) => count(array_filter( $el['sizes'], fn($size) => in_array('2038597018816', $size['ruID']), )) > 0, );

    • Проверил, и Ваш работает. Спасибо, какие же Вы все молодцы, так с ходу всё понимать и сразу делать. Я неделями с такими вопросами разобраться не могу.
    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);

    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);

    • При mixed пишет ошибку

      Fatal error: Uncaught TypeError: Argument 2 passed to finder() must be an instance of mixed, string given, called i

      .
      Без mixed находит. Отлично! Спасибо за помощь, буду разбираться дальше.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

    Для поиска одного из массивов в многомерном массиве по имеющемуся значению необходимо пройтись по всем элементам и проверить каждый из них на соответствие искомому значению. Например, если у нас есть многомерный массив $arr, и нам нужно найти массив, в котором содержится значение $value, то мы можем использовать следующий алгоритм:

    1. Проходим по всем элементам массива $arr с помощью цикла foreach.
    2. Для каждого элемента проверяем, является ли он массивом с помощью функции is_array.
    3. Если элемент является массивом, то рекурсивно вызываем функцию поиска для этого массива.
    4. Если элемент является значением и равен искомому значению $value, то возвращаем этот массив.
    5. Если ни в одном из массивов не найдено искомого значения, возвращаем false.

    Пример кода на PHP:

    ```php
    function findArrayByValue($arr, $value) {
    foreach ($arr as $item) {
    if (is_array($item)) {
    $result = findArrayByValue($item, $value);
    if ($result !== false) {
    return $result;
    }
    } elseif ($item === $value) {
    return $arr;
    }
    }
    return false;
    }

    // Пример использования
    $arr = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
    ];

    $value = 5;
    $result = findArrayByValue($arr, $value);

    if ($result) {
    print_r($result);
    } else {
    echo "Массив с искомым значением не найден.";
    }
    ```

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно