Есть ли способ выполнить foreach () через один массив на основе совпадающего значения с другим ключом в другом массиве? В этом примере у меня есть массив категорий ($ cat_data) с cat_id в качестве ключа и массив изображений ($ img_data) с category_id в качестве ключа.
Array (
[0] => Array (
[cat_id] => 1
[cat_name] => Category 1
)
[1] => Array (
[cat_id] => 2
[cat_name] => Category 2
)
)
Array (
[0] => Array (
[img_id] => 2
[img_name] => demo1.jpg
[img_label] => Demo 1
[category_id] => 2
[img_order] => 1
)
[1] => Array (
[img_id] => 3
[img_name] => demo2.jpg
[img_label] => Demo 2
[category_id] => 2
[img_order] => 2
)
[2] => Array (
[img_id] => 4
[img_name] => demo3.jpg
[img_label] => Demo 3
[category_id] => 1
[img_order] => 1
)
)
Я хочу вывести свой дисплей так, чтобы он выглядел следующим образом:
Category 1
demo3.jpg
Category 2
demo1.jpg
demo2.jpg
Поскольку я действительно не очень хорошо разбираюсь в массивах, я подумал, что попробую Stack, и мне не удалось найти ответ на свой вопрос, отчасти потому, что я не уверен, что именно спрашивать. Любая помощь??
2 ответа
Наивный способ:
foreach ($cat_data as $cat) {
echo $cat['cat_name'];
foreach ($img_data as $img) {
if ($img['category_id'] != $cat['cat_id']) {
continue;
}
echo $img['img_name'];
}
}
Это довольно неэффективно, поскольку выполняется несколько циклов по массиву $imgs
, но легко и работает.
Более эффективным:
$images = array();
foreach ($img_data as $img) {
$images[$img['category_id']][] = $img;
}
foreach ($cat_data as $cat) {
echo $cat['cat_name'];
if (isset($images[$cat['cat_id']])) {
foreach ($images[$cat['cat_id']] as $img) {
echo $img['img_name'];
}
}
}
Сначала все изображения группируются по категориям в новый массив, который затем можно перебрать один раз.
Я бы посоветовал вам изменить дизайн вашего массива, когда вы заполняете его данными, чтобы вместо этого он выглядел примерно так.
Array (
[0] => Array (
[cat_id] => 1
[cat_name] => Category 1
[images] = Array(
[0] => Array (
[img_id] => 4
[img_name] => demo3.jpg
[img_label] => Demo 3
[category_id] => 1
[img_order] => 1
)
)
)
[1] => Array (
[cat_id] => 2
[cat_name] => Category 2
[images] = Array(
[0] => Array (
[img_id] => 4
[img_name] => demo3.jpg
[img_label] => Demo 3
[category_id] => 1
[img_order] => 1
)
[1] => Array (
[img_id] => 2
[img_name] => demo1.jpg
[img_label] => Demo 1
[category_id] => 2
[img_order] => 1
)
)
)
)
Тогда у вас будут связаны все реляционные данные, и вам просто нужно будет перебрать ваш массив категорий и распечатать изображения , связанные с каждой из них по очереди. Нумерованные индексы можно было бы даже изменить на ассоциативные имена, если, например, id категории не был важен. Затем массив может быть проиндексирован с названием категории и содержать только изображения этой категории.
Если изображения будут использоваться в других местах, где их первоначальный макет подходит лучше, вы все равно можете использовать этот макет для своего основного графика данных. Просто замените фактические данные изображений в массиве изображений под каждой категорией ссылкой на фактический объект изображения.
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.