Есть ли способ выполнить 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, и мне не удалось найти ответ на свой вопрос, отчасти потому, что я не уверен, что именно спрашивать. Любая помощь??

1
f8xmulder 30 Авг 2011 в 18:23

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'];
        }
    }
}

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

5
deceze 30 Авг 2011 в 14:27

Я бы посоветовал вам изменить дизайн вашего массива, когда вы заполняете его данными, чтобы вместо этого он выглядел примерно так.

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 категории не был важен. Затем массив может быть проиндексирован с названием категории и содержать только изображения этой категории.

Если изображения будут использоваться в других местах, где их первоначальный макет подходит лучше, вы все равно можете использовать этот макет для своего основного графика данных. Просто замените фактические данные изображений в массиве изображений под каждой категорией ссылкой на фактический объект изображения.

2
inquam 30 Авг 2011 в 14:44