是否有一种方法来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数组中图像的实际数据替换为对实际图像对象的引用。