У меня есть массив с данными, которые я хочу отображать с разбивкой на страницы.
$display_array = Array ( [0] => "0602 xxx2", [1] => "0602 xxx3", [2] => 5 // Total= 2+3 [3] => "0602 xxx3", [4] => "0602 saa4", [5] => 7 // Total = 3+4 )
Я попробовал что-то вроде этого
function pagination($display_array, $page) { global $show_per_page; $page = $page < 1 ? 1 : $page; $start = ($page - 1) * $show_per_page; $end = $page * $show_per_page; for($i = $start; $i < $end; $i++) { ////echo $display_array[$i] . "<p>"; // How to manipulate this? // To get the result as I described below. } }
Я хочу сделать разбиение на страницы, чтобы получить ожидаемый результат следующим образом:
Если я определяю $show_per_page = 2;
затем pagination($display_array, 1);
выходы:
0602 xxx2 0602 xxxx3 Total:5
И paganation($display_array, 2);
выходы:
0602 xxx3 0602 saa4 Total:7
Если я определяю $show_per_page = 3;
, затем pagination($display_array, 1);
выходы:
0602 xxx2 0602 xxxx3 Total: 5 0602 xxx3
И paganation($display_array, 2);
выходы:
0602 saa4 Total:7
Если я определяю $show_per_page = 4;
выходы:
0602 xxx2 0602 xxxx3 Total:5 0602 xxx3 0602 saa4 Total: 7
Посмотри на это:
function paganation($display_array, $page) { global $show_per_page; $page = $page < 1 ? 1 : $page; // start position in the $display_array // +1 is to account for total values. $start = ($page - 1) * ($show_per_page + 1); $offset = $show_per_page + 1; $outArray = array_slice($display_array, $start, $offset); var_dump($outArray); } $show_per_page = 2; paganation($display_array, 1); paganation($display_array, 2); $show_per_page = 3; paganation($display_array, 1); paganation($display_array, 2);
Выход:
// when $show_per_page = 2; array 0 => string '0602 xxx2' (length=9) 1 => string '0602 xxx3' (length=9) 2 => int 5 array 0 => string '0602 xxx3' (length=9) 1 => string '0602 saa4' (length=9) 2 => int 7 // when $show_per_page = 3; array 0 => string '0602 xxx2' (length=9) 1 => string '0602 xxx3' (length=9) 2 => int 5 3 => string '0602 xxx3' (length=9) array 0 => string '0602 saa4' (length=9) 1 => int 7
Результат для $ show_per_page = 3 отличается от вашего, но я не уверен, чего вы ожидаете? Вы хотите получить все, что осталось (т.е. «0602 saa4» и 7) плюс один предыдущий элемент (т.е. «0602 xxx3»)?
Использовать array_chunk
:
function paginate($array, $pageSize, $page = 1) { $pages = array_chunk($array, $pageSize); return $page > sizeof($pages) ? [] : $pages[$page - 1]; }
или используйте более чистую версию ответа Марцина:
function paginate($array, $pageSize, $page = 1) { $page = $page < 1 ? 1 : $page; $start = ($page - 1) * $pageSize; return array_slice($array, $start, $pageSize); }
$ output = array_slice ($ inputArray, $ page-1, $ showPerPage); $ output будет содержать требуемый интервал. $ total = sizeof ($ inputArray); / общее количество элементов в массиве /