【问题标题】:Two Arrays, One Output (How to ForEach?)两个数组,一个输出(如何 ForEach?)
【发布时间】:2011-08-30 14:23:58
【问题描述】:

有没有一种方法可以根据与另一个数组中不同键的匹配值通过一个数组进行 foreach()?在这个例子中,我有一个以 cat_id 为键的类别数组 ($cat_data) 和一个以 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,但我无法找到我的问题的答案,部分原因是我不确定要准确地要求什么.有什么帮助吗??

【问题讨论】:

    标签: php arrays foreach


    【解决方案1】:

    天真的方式:

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

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

    【讨论】:

    • @stereo 哪个更好真的取决于具体情况。第二个使用更多内存,但效率更高。我更喜欢早期的continue 而不是深度嵌套,假设该循环中会有更多代码。
    • 两者都有效,但由于我没有大量数据,“天真的”方式实际上对我的目的非常有效。感谢您的洞察力!
    【解决方案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 不重要,编号索引甚至可以更改为关联名称。然后该数组可以使用类别的名称进行索引,并且只包含该类别的图像

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

    【讨论】:

    • 很遗憾,我还没有设计实际的数组,我只处理数组输出的内容。
    猜你喜欢
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2015-04-05
    相关资源
    最近更新 更多