PHP: разбиение на страницы над массивом создает нежелательное дополнительное значение - PullRequest
1 голос
/ 07 февраля 2020

У меня есть массив значений, которые я разбил на страницы с помощью простой функции. Все работает нормально, за исключением одной небольшой ошибки, которую я не могу решить.

Если вы запустите приведенный ниже код, вы получите массив от 1 до 18, распечатанный на 4 страницах. Переменная $per_page определяет, сколько значений показано на странице. В нашем случае должно иметь 4 страницы (18/5 = 3,6, поэтому первые три страницы имеют 5 значений каждая, а последняя четвертая страница имеет оставшиеся 3 - или «0,6» - значения) .

Ошибка состоит в том, что страница 1 имеет значения от 1 до 5, страница 2 - от 5 до 9, страница 3 - от 10 до 14, а страница 4 - от 15 до 18. По какой-то причине обе страницы одна и две получают значение 5, которое создает одно дополнительное значение для разбиения на страницы. Дальнейшее недоумение вызывает то, почему это происходит только с конечным значением на первой странице, но не на последующих страницах.

Можете ли вы увидеть, как именно я создаю дополнительное значение 5 для разбивки на страницы и как я можно это убрать?

<?php
$array = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18);

// PAGINATION FUNCTION
function paginateArray($array, $from, $per_page) {
    $i = 0; $page = 0;
    foreach ($array as $key => $value) {
        $page++; if ($from <= $page && $i < $per_page) { $i++; yield $key => $value; }
    }
}
$per_page = 5; // HOW MANY VALUES TO SHOW PER PAGE
$num_of_pages = count($array) / $per_page; // TOTAL NUMBER OF PAGES
$from = (int)(isset($_GET['from']) ? $_GET['from'] : 0); // GET USER NAVIGATION INPUT
unset($_GET['from']);

$content = ""; // DEFINE PAGE CONTENT
// APPEND PAGINATED ARRAY TO CONTENT
foreach (paginateArray($array, $from * $per_page, $per_page) as $array_item) {
    $content .= "$array_item<br>";
}

// PAGINATION NAVIGATION NUMBERS AND ARROWS
if ($from >= 1) { $content .= "<a href=?from=".($from - 1)."> < </a>  |  "; } else { $content .= "< | "; }
for ($i = 0; $i <= floor(($num_of_pages)); $i++) { if ($from !== $i) { $content .= "<a href=?from=$i>".($i + 1)."</a>  |  "; } else { $content .= "".($i +1)."  |  "; } }
if ($from <= ($num_of_pages - 1)) { $content .= "<a href=?from=".($from + 1)."> > </a>"; }  else { $content .= ">"; }

print $content; // PRINT CONTENT
?>

1 Ответ

2 голосов
/ 07 февраля 2020

Ваша проблема в том, что когда вы выводите последующие страницы, вы начинаете вывод слишком рано, потому что вы эффективно сравниваете $from с индексом массива next (так как вы увеличиваете $page перед сравнением ) и поэтому вы должны использовать

$from < $page

вместо

$from <= $page

Обратите внимание, что вам не нужна переменная $page в этом коде, вы можете просто использовать ключ массива ($key в вашем коде). Например:

function paginateArray($array, $from, $per_page) {
    $i = 0;
    foreach ($array as $key => $value) {
        if ($from <= $key && $i < $per_page) {
            $i++;
            yield $key => $value;
        }
    }
}

Демонстрация на 3v4l.org

...