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