两个阵列,一个输出(如何每个?)

时间:2011-08-30 14:23:58

标签: php arrays foreach

有没有办法通过一个数组foreach()基于匹配值与另一个数组中的不同键?在这个例子中,我有一个类别数组($ cat_data),其中cat_id作为键,以及一个以category_id为键的图像数组($ img_data)。

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 个答案:

答案 0 :(得分:5)

天真的方式:

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

首先按类别将所有图像分组到一个新数组中,然后可以直接循环一次。

答案 1 :(得分:2)

我建议您在填充数据时重新设计数组,而不是看起来像这样。

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 不重要,则编号的索引甚至可以更改为关联名称。然后可以使用类别的名称对数组进行索引,只包含该类别的图像

如果要在其他初始布局更合适的地方使用图像,您仍然可以将此布局用于主数据图。只需将参考下每个类别下的图像数组中的图像的实际数据替换为实际图像对象。