Два массива, один выход (как для каждого?) - PullRequest
1 голос
/ 30 августа 2011

Есть ли способ 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 ]

5 голосов
/ 30 августа 2011

Наивный путь:

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

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

2 голосов
/ 30 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...