两个数组,一个输出(如何ForEach?)


Two Arrays, One Output (How to ForEach?)

是否有一种方法来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,我还没能找到我问题的答案,部分原因是我不确定该问什么。任何帮助吗?

naïve方式:

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

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