使用html标记在while循环中使用多个数据显示一次类别

时间:2013-11-07 08:31:26

标签: php mysqli

我一直在努力解决这个问题并找到了很多解决方案,但仍然无法开展工作。我对代码感到非常沮丧,我想我会一步一步地做到这一点,而不是把它完全集中在一起,让它立即运行。

现在我的桌子是:

categories | name
fashion    | chanel
fashion    | prada
cafes      | starbucks
cafes      | tcc
dining     | kfc
dining     | macdonalds

我想要实现的是

1) Echo-ing out the categories <h1>fashion</h1> with once instead of duplicating and <ul> if it is starting on a new category

2) Echo-ing out all the <li>name</li> no matter how many of names are under that fashion

3) Echo-ing out </ul> if it is the last name in that fashion

等等其他类别。这是我脑子里想到的,我不知道这是否实用。

我尝试过这种方式:

$result = mysqli_query($con,"SELECT * FROM floor_directory WHERE level='$level' ORDER BY categories");
while($row = mysqli_fetch_array($result)){
                if($previousVal != $row['categories']){
                     $data .= '<h1>'.$row['categories'].'</h1><ul class="shop_listing">';
                     $previousVal = $row['categories'];
                }
                 $data .= '<li>
                           <p class="float_left">'.$row['name'].'</p>
                           </li></ul>';
            }

我知道在关闭ul的循环中出现了问题。这是我长时间陷入困境,无法在任何地方找到任何解决方案的地方。无论我做什么,为不同的类别预告,如果不是的话,我仍然无法靠近。

我得到的结果是:

<h1>fashion</h1>
<ul class="shop_listing">
<li><p>chanel</p></li>
</ul>
<li><p>prada</p></li>

<h1>dining</h1>
<ul class="shop_listing">
<li><p>kfc</p></li>
</ul>
<li><p>macdonald</p></li>

或者:

<h1>fashion</h1>
<ul class="shop_listing">
<li><p>chanel</p></li>
<li><p>prada</p></li>

<h1>dining</h1>
<ul class="shop_listing">
<li><p>kfc</p></li>
<li><p>macdonald</p></li>
</ul>
</ul>

希望你们能帮助我。对于那些只是把链接和评论阅读更多的人,请不要在这里输入您的答案。我不需要那些,我已经非常困惑,我只是一个初学者。如果有人愿意指导甚至向我解释为什么我的代码不起作用以及为什么提供的解决方案能够奏效,我感到很高兴。提前谢谢!

2 个答案:

答案 0 :(得分:2)

一种方法是使用category作为键创建一个新数组,并将属于该类别的所有名称放入其中的数组中。循环遍历新数组并创建HTML。

PHP

$temp_array=array();//temporary array

$result = mysqli_query($con,"SELECT * FROM floor_directory WHERE level='$level' ORDER BY categories");

while($row = mysqli_fetch_array($result)){
    $temp_array[$row['categories']][]=$row['name'];//put data into temporary array
}

foreach($temp_array AS $category=>$names){
    $data.='<h1>'.$category.'</h1><ul class="shop_listing">';
    foreach($names AS $name){
        $data.='<li>
               <p class="float_left">'.$name.'</p>
               </li>';
    }
    $data.='<ul>';
}

未经测试,但它应该做你需要的。

答案 1 :(得分:1)

试试这个

$result = mysqli_query($con,"SELECT * FROM floor_directory WHERE level='$level' ORDER BY 

    categories");
    while($row = mysqli_fetch_array($result)){
                    if($previousVal != $row['categories']){
                         if($data) {
                               $data .= "</ul>";
                         }
                         $data .= '<h1>'.$row['categories'].'</h1><ul class="shop_listing">';
                         $previousVal = $row['categories'];
                    }
                     $data .= '<li>


                     <p class="float_left">'.$row['name'].'</p>
                                   </li>';
                    }
$data .= "</ul>";