【问题标题】:Why doesn't my loop echo for all iterations?为什么我的循环对所有迭代都不回显?
【发布时间】:2014-10-11 17:56:24
【问题描述】:

我正在尝试创建一个标签云系统,从 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的页脚看到它的工作原理

【问题讨论】:

    标签: php loops do-while tag-cloud


    【解决方案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]]; 
    }
    

    【讨论】:

    • 我在 atm 没有收到任何错误消息,所以我假设没有,我会添加一些并查看它的内容,好的,刚刚添加了错误报告,我得到了“未定义的偏移量”我会用谷歌搜索找出它的意思。我相信你使用两个循环的权利,所以会尝试一下:)
    【解决方案2】:

    我认为问题出现在下面一行

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

    希望对你有帮助

    【讨论】:

    • 目前我不想直接从 sql 进行限制,因为我仍在试验系统,我希望可能允许用户可以选择他们想要多少标签的设置看到
    • 在这种情况下,您可以在查询中将标签的数量作为参数传递
    猜你喜欢
    • 2023-01-27
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-09-07
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多