@Kurusa

Telegram, php как написать алгоритм пагинации?

У меня есть такой алгоритм пагинации для inline_keyboard, который строит 2 колонки по 6 элементов, и если элементов больше 12, но меньше 24 (раньше больше 24 у меня не было), я вручную это проверяла и дублировала код:
while ($row = mysqli_fetch_assoc($result)) {

        $one_row[$cnt] = [
            "text" => $row["test"],
            "callback_data" => "test"
        ];
        $cnt++;

        if ($cnt == 2) {
            $buttons[] = $one_row;
            $one_row = [];
            $cnt = 0;
        }
    }


Но он оказался очень не досконален, потому что если есть, например, не 14, а 15 элементов, то 15 сьедается. В общем, принимает только парное к-во элементов и если есть только 1 элемент — не показывается. В общем, прошу у вас помощи, пожалуйста. Не приходит в голову как его нормально переписать.

Если нужно, опишу ситуацию: у меня погодный бот и я дошла до этапа заполнения городов, так что к-во элементов будет сталым, но всё равно этот алгоритм нужно сделать универсальним и удобным. Помогите, пожалуйста
  • Вопрос задан
  • 289 просмотров
Решения вопроса 3
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Вы добавляете данные в buttons на итерации когда количество элементов в $one_row == вашему количеству колонок (в частном случае 2).
Соответственно если у вас данных некратное число - то остается огрызок.
Очевидное решение - после цикла проверять что лежит в $one_row и если нужно - сохранять.
$columns = 2;

$buttons = [];
$one_row = [];
while ($row = mysqli_fetch_assoc($result)) {
    $one_row[] = [
        "text" => $row["test"],
        "callback_data" => "test"
    ];
    if (count($one_row) == $columns) {
        $buttons[] = $one_row;
        $one_row = [];
    }
}
if (count($one_row) > 0) {
    $buttons[] = $one_row;
}
Ответ написан
Комментировать
coderisimo
@coderisimo
если модернизировать именно Вашу функцию, то должно проучиться что-то вроде :

$cnt = 0;
$buttons = [];
$one_row = [];

while ($row = mysqli_fetch_assoc($result)) {
        $one_row[$cnt] = [ "text" => $row["test"], "callback_data" => "test" ];
        $cnt++;

        if ($cnt === 2) {
            $buttons[] = $one_row;
            $one_row = [];
            $cnt = 0;
        }
    }

if($cnt === 1 )
$buttons[] = $one_row ;
Ответ написан
Комментировать
@BorisKorobkov Куратор тега PHP
Web developer
Не усложняйте без необходимости.
Нужное количество отмеряйте в sql с помощью limit/offset. И выводите всё подряд.
А колонки проще делать блочным элементом 50% ширины (например, в bootstrap это class="col-sm-6"), они сами будут переноситься на 2 столбца.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы