我有一个示例数据:
mobile(id, name, os)
(1, "samsung 1", "android")
(2, "samsung 2", "android")
(3, "iPhone 3", "OS")
(4, "iPhone 4", "OS")
(5, "samsung 3", "android")
并查询:
$db =& JFactory::getDBO();
$query = "SELECT id, name, os
FROM `mobile` order by os";
$db->setQuery($query);
$rows = $db->loadObjectList();
$i=0;
$data = array();
foreach ($rows as $row) {
if(empty($data[$row->os])) {
$data[$row->os] = array();
}
if(empty($data[$row->os][$row->name])) {
$data[$row->os][$row->name] = array();
}
$data[$row->os][$row->name] = $row->id;
}
<?php foreach ($data as $os => $names) {?>
<li>
<?php echo $os; ?>
<ul>
<?php
foreach ($names as $name => $id) {
?>
<li>
<?php echo $name; ?>
</li>
<?php
}
?>
</ul>
</li>
<?php $i++; }?>
当我运行代码时,结果不显示在此:
android
-samsung 1
-samsung 2
-samsung 3
OS
-iPhone 3
-iPhone 4
如何解决?
答案 0 :(得分:0)
$data[$row->os][$row->name] = $row->id
应该是
$data[$row->os][$row->id] = $row->name
(并相应地更改如下)
您继续使用$data["android"]["Samsung"]
覆盖1, 2, 3, 4
;通过ID等唯一的东西来索引,而不是通过可以重复的名称来索引。
编辑:我看到你将$data[$row->os][$row->id]
初始化为数组,但是然后用$row->name
覆盖该值;并且你不会在它上面循环;所以它没用。这也是一种方式,但效率较低,因为更多不必要的循环。
答案 1 :(得分:0)
改变这个:
$data[$row->os][$row->name] = $row->id;
对此:
$data[$row->os][$row->name][] = $row->id;
第一个用单个项目替换数组。第二个将项目推送到数组上。