Почему мой цикл не отображается на всех итерациях?

Я пытаюсь сделать так, чтобы система облаков тегов получала свои значения из 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

0

Решение

Кажется, вы пытаетесь отобразить элемент $ 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

Другие решения

Я думаю, что проблема возникает в следующей строке

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 в ваш запрос, чтобы упростить код?

Надеюсь, поможет

1

По вопросам рекламы [email protected]