Как найти один из массивов многомерного массива, по имеющемуся в нём значению?
Добрый день.
Есть многомерный массив, включающий в себя и ассоциативный и простой, с разными уровнями вложенности.
Вот его часть вывода через 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?
$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 находит. Отлично! Спасибо за помощь, буду разбираться дальше.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для поиска одного из массивов в многомерном массиве по имеющемуся значению необходимо пройтись по всем элементам и проверить каждый из них на соответствие искомому значению. Например, если у нас есть многомерный массив $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 "Массив с искомым значением не найден.";
}
```
Таким образом, используя рекурсивную функцию поиска, мы можем найти один из массивов многомерного массива по заданному значению.