【发布时间】:2017-03-31 15:05:09
【问题描述】:
已解决
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_id1 苹果 iPhone 6 1 1 2 苹果 iPhone 6s 1 1 3 苹果 iPad 空气 1 2
dev_id 是主键,cat_id 因品牌而异(Apple = 1,Samsung = 2 等),subcat_id 表示如果设备是手机 (1) 或平板电脑 (2)。
我想在一个带有 Smartphones 标题的列表中回显一个品牌的所有设备,这些设备已分配了 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的后续问题
【问题讨论】:
-
什么是 $row_all_dev?如果要循环中行的某一列的数据,参考$row['column_name']。
-
在我的 HTML 文档的顶部,我将包含有关当前显示品牌的所有设备的信息的所有行加载到变量 $row_all_dev 中。我知道它很难看,但由于该变量包含页面上显示的所有设备的所有数据,我可以从中提取图像。
-
那为什么是foreach?在循环内部,您不使用 $row 值,您可以在其中找到“行”的特定值。
-
在我看来,我需要一个 for 循环来以一种干净的方式完成它,但如果有更简单的方法来实现我的目标,请告诉我。我的代码基于this answer。那里没有给出关于 $row 的解释,但现在你说,我查询的数据确实被加载到 $row 中。如果我编辑 $sql 以包含 dev_name、dev_id 并编辑回显以从 $row 而不是 $row_all_dev 加载,它只会回显数字 1-18,这实际上看起来像预期的那样,因为数组只包含数字。但是,我需要相关数据,而不是数字。
-
有人吗?我仍然卡在这个问题上。