为什么不';t所有迭代的循环回声


Why doesn't my loop echo for all iterations?

我正试图让一个标签云系统从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

您似乎正在尝试使用索引来回显$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]]; 
}

我认为问题发生在以下行

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来简化代码呢?

希望它能帮助