解决
Sloan Trasher's answer效果很好。我添加了另一组if语句来检查 subcat_id 并在相应的前面打印正确的标题。
if($curr_sub_cat != $row['subcat_id']) {
if($curr_sub_cat != '') {
echo "</div>\n";
}
$curr_sub_cat = $row['subcat_id'];
if($curr_sub_cat == '1') {
echo "<h1 class='anchor' id='smartphones'>Smartphones</h1>";
echo "<div class='flexed-boxes'>\n";
}
if($curr_sub_cat == '2') {
echo "<h1 class='anchor' id='tablets'>Tablets</h1>";
echo "<div class='flexed-boxes'>\n";
}
}
原始问题
我有一个数据库表,看起来像这样:
dev_id dev_name cat_id subcat_id
1 Apple iPhone 6 1 1 2 Apple iPhone 6s 1 1 3 Apple iPad Air 1 2
dev_id 是主键, cat_id 对于每个品牌都不同(Apple = 1,Samsung = 2等), subcat_id 表示如果设备是手机(1)或平板电脑(2)。
我希望回显一个品牌的所有设备,这些设备在一个列表中使用标题智能手机分配了 subcat_id == 1 。列 subcat_id == 2 的所有行都需要在列表 Tablets 之下的列表中。两个列表都需要按主键按升序排序。
像这样使用PDO::FETCH_GROUP
和PDO::FETCH_COLUMN
:
$sql = "SELECT subcat_id,dev_id FROM devices WHERE cat_id='$cat_id' ORDER BY dev_id";
$data = $db->query($sql)->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN);
使用所有(在本例中为Apple)设备打印数组:
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
[10] => 11
[11] => 12
)
[1] => Array
(
[0] => 13
[1] => 14
[2] => 15
[3] => 16
[4] => 17
[5] => 18
)
)
如果我按如下方式实现for循环:
$cat_name_lower=strtolower($cat_name);
$dev_name_ul=str_replace(array("$cat_name "," "),array("","_"),$row_all_dev['dev_name']);
foreach ($data as $dev => $dev_data)
{
echo "<div class='flexed-boxes'>
";
foreach ($dev_data as $row)
{
echo "<a class='singlebox trpl' href='/devices/".$cat_name_lower."/smartphone_details.php?dev_name=".$dev_name_ul."'>
<img class='singlebox-media' src='".$cat_name_lower."/img/".$row_all_dev['dev_img']."' alt='".$row_all_dev['dev_name']."'>
<span class='singlebox-header'>".$row_all_dev['dev_name']."</span>
</a>
";
}
echo "</div>";
}
我得到表格中的第一个条目(iPhone 6,在我的实际数据库中,dev_id为6),打印时间为18 - picture for clarification。但是,我想要行to show up like this(图片中的第二行包含iPhone 6,6 Plus和6s,恰好具有相同的图片)。
对我来说,看起来for循环是正确迭代但内部数组指针不是一个先进的?我哪里错了?
此问题是对this one
的跟进答案 0 :(得分:0)
试试这个:
$sql = "";
$sql .= "SELECT\n";
$sql .= " subcat_id,\n";
$sql .= " dev_id,\n";
$sql .= " dev_img,\n"; // Not sure if that column exists in the table???
$sql .= " dev_name\n";
$sql .= "FROM devices\n";
$sql .= "WHERE cat_id='$cat_id'\n";
$sql .= "ORDER BY subcat_id, dev_id";
$data = $db->query($sql)->fetchAll();
$cat_name_lower = strtolower($cat_name);
echo "<div class='flexed-boxes'>\n";
$curr_sub_cat = '';
foreach($data as $row_no => $row) {
$dev_name_ul = str_replace(array("$cat_name "," "),array("","_"),$row['dev_name']);
if($curr_sub_cat != $row['subcat_id']) {
if($curr_sub_cat != '') {
echo "</div>\n";
echo "<div class='flexed-boxes'>\n";
}
$curr_sub_cat = $row['subcat_id'];
}
echo "<a class='singlebox trpl' href='/devices/".$cat_name_lower."/smartphone_details.php?dev_name=".$dev_name_ul."'>
<img class='singlebox-media' src='".$cat_name_lower."/img/".$row["dev_img"]."' alt='".$row['dev_name']."'>
<span class='singlebox-header'>".$row['dev_name']."</span>
</a>\n";
}
echo "</div>\n";
// echo "<p>\$data:<pre>".print_r($data,true)."</pre></p>\n";
答案 1 :(得分:-1)
尝试此操作并在问题中显示结果。它还没有答案,但会提供给你答案所需的信息。
$sql = "";
$sql .= "SELECT\n";
$sql .= " subcat_id,\n";
$sql .= " dev_id,\n";
$sql .= " dev_name\n";
$sql .= "FROM devices\n";
$sql .= "WHERE cat_id='$cat_id'\n";
$sql .= "ORDER BY subcat_id, dev_id";
$data = $db->query($sql)->fetchAll();
echo "<p>\$data:<pre>".print_r($data,true)."</pre></p>\n";