为什么我的循环不会回显所有迭代?

时间:2014-10-11 17:56:24

标签: php loops do-while tag-cloud

我正在尝试使标签云系统从PHP / SQL获取其值,但它似乎工作不正常,只提供了一些预期的结果。是什么导致了这种奇怪的行为?

据我所知,它应该循环总共20次(0-19)并且每次它将一个字符串添加到数组中。

系统首先从我的数据库中按降序获取20个最受欢迎的标签,一旦得到它我创建一个字符串并设置字体大小。然后将该字符串存储在一个数组中,并使用随机数字阵列进行回显,从而为云提供随机顺序。

然后我为循环迭代增加了i的值,同时减少了下一个不太流行的标记的字体大小。

<h1>Tag Cloud</h1>
    <?php
        $sql = "SELECT * FROM tags ORDER BY count DESC";
        $tags_query = mysqli_query($db_conx, $sql);           
        $i = 0;
        $tag_array = array();
        $tag_size_max = 36;
        $tag_size_min = 16;

        $numbers = range(0, 19);
        shuffle($numbers);

        do {
            $row = mysqli_fetch_array($tags_query, MYSQLI_ASSOC);
            $tag = $row["tag"];  
            $tag_count = $row["count"];             


            $tag_array[] = "<p style='font-size:".$tag_size_max."px; padding:0px;'>".$tag."</p>";

            echo $tag_array[$numbers[$i]];

            $i++;
            $tag_size_max--;    

        } while ($i < 20);
    ?>

您可以在我的网站http://www.vwrx-project.co.uk

的页脚中看到它的工作方式

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试使用索引来回显$ tag_array元素,该索引尚未在数组本身中显示。 你可能需要两个循环 - 首先填充$ tag_array,另一个循环来回显它们。

你有正确的ERROR_LEVEL - 应该有一些关于缺失索引的通知 - 至少我是否正确准备好你的代码;)

这样的事情:

// fill the array
for ($i=0; $i<20; $i++) {
    $row = mysqli_fetch_array($tags_query, MYSQLI_ASSOC);
    $tag = $row["tag"];  
    $tag_count = $row["count"]; // this seems to be unused
    $tag_array[] = "<p style='font-size:".$tag_size_max."px; padding:0px;'>".$tag."</p>";
}

// echo the array
for ($i=0; $i<count($tag_array); $i++) {
    echo $tag_array[$numbers[$i]]; 
}

答案 1 :(得分:1)

我认为问题发生在以下一行

echo $tag_array[$numbers[$i]];

当您推送到数组

  $tag_array[] = "<p style='font-size:".$tag_size_max."px; padding:0px;'>".$tag."</p>";

您可以获得每个标记的索引,例如

[0] =>"<p style='font-size:".$tag_size_max."px; padding:0px;'>".$tag."</p>";     
[1] =>"<p style='font-size:".$tag_size_max."px; padding:0px;'>".$tag."</p>";

每次迭代

然后在接下来的行中使用$ number数组从数组中回显一个随机元素(可能与您刚刚创建的元素不同),该数组在重排后不会被排序。

我建议您首先使用

从数据库中重新调整结果
   $results = array();
  while($row =mysqli_fetch_array($tags_query, MYSQLI_ASSOC))
 {
    array_push($results, $row);
  }

  shuffle($results);

然后使用结果数组创建一个“正常”循环以在标签中打印。 此外,如果您只需要20个标签,为什么不在查询中添加LIMIT 20以简化代码?

希望有所帮助