Алгоритм разделения отображения страниц на…?
-
14-11-2019 - |
Вопрос
Есть $A
это данные для пагинации:
$A = array(
0=>array(
0=>1,
1=>2
),
1=>array(
0=>3,
1=>5,
2=>2
),
2=>array(
0=>3,
1=>1,
2=>6,
3=>6
)
);
Кто-нибудь может помочь мне получить ожидаемый результат (output this "...." more)
самое важное ?
....
сказал, что это еще один элемент, необходимый для отображения следующей страницы.или это оставшийся элемент с предыдущей страницы.
Есть 09
элементы $A
для отображения, так что
я установил
$show_per_page = 3;
Вывод (для первой страницы):
1
2
Total:3
3
....//output this "...." more
Вывод (для второй страницы):
....//output this "...." continue from first page
5
2
Total:10
3
.... //output this "...." more
Вывод (для третьей страницы):
.... //output this "...." continue from second page
1
6
6
Total:16
если я установлю
$show_per_page = 5;
Вывод (для первой страницы):
1
2
Total:3
3
5
2
Total:10
// .... //not output this "...." more now
Вывод (для второй страницы):
3
1
6
6
Total:16
если я установлю
$show_per_page = 9;
ВЫХОД:
1
2
Total:3
3
5
2
Total:10
3
1
6
6
Total:16
В настоящее время я пытаюсь сделать с функцией paging_from_multi_arr
но я застрял в том, как реализовать получение ожидаемого результата:
// page to show (1-indexed)
// number of items to show per page
function paging_from_multi_arr($display_array, $page){
Global $show_per_page;
$start = $show_per_page * ($page-1);
$end = $show_per_page * $page;
$i = 0;
foreach($display_array as $main_order=>$section){
$total = 0;
foreach($section as $sub_order=>$value){
if($i >= $end){
break 2; // break out of both loops
}
$total += $value;
if($i >= $start){
echo $value.'<br>';
}
$i++;
}
if($i >= $start){
echo 'Total:'.$total.'<br>';
}
if($i >= $end){
break;
}
}
$total = count($display_array, COUNT_RECURSIVE);
// Total numbers of elements in $display_array array.
// See http://php.net/manual/en/function.count.php
if ($end < $total){
echo "...";
}
}
$show_per_page = 5;
paging_from_multi_arr($A,$_GET["page"]);
Есть ли у вас какие-либо идеи относительно этой функции?Или может дать лучший алгоритм?
Спасибо
Решение
Это должно дать вам результат, который вы ищете:
function flatten_display_array($display_array){
$new_array = array();
$count = 0;
foreach($display_array as $main_order => $section){
$total = 0;
foreach($section as $sub_order => $value){
$new_array[] = array('main' => $main_order,
'sub' => $sub_order,
'value' => $value);
$total += $value;
$count++;
}
// Add section's total to final element in section
$new_array[$count-1]['total'] = $total;
}
return $new_array;
}
function paging_from_multi_array($display_array, $page = 1, $show_per_page = 3){
if(isset($_GET['page']) && is_numeric($_GET['page'])){
// Page number set externally
$page = $_GET['page'];
}
if(isset($_GET['per_page']) && is_numeric($_GET['per_page'])){
// Per page set externally
$show_per_page = $_GET['per_page'];
}
$start = $show_per_page*($page-1);
$end = $show_per_page*$page;
// Convert array to useable format
$new_array = flatten_display_array($display_array);
/* Formatting elements */
$top_string = '....'; // Indicator continues is on previous page
$bottom_string = '....'; // Indicator continues on next page
$br = '<br />'; // Line break
$indent = ' '; // Indent of value row
$count = 0;
$string = '';
for($i = $start; $i < $end; $i++){
// Loop through visible range
$string .= $indent.$new_array[$i]['value'].$br;
if(isset($new_array[$i]['total'])){
$string .= 'Total: '.$new_array[$i]['total'].$br;
}
}
// Check previous page
if($start > 0 && $start < count($new_array) && !isset($new_array[$start-1]['total'])){
// Started mid-way through section
$string = $top_string.$br.$string;
}
// Check next page
if($end-1 < count($new_array) && !isset($new_array[$end-1]['total'])){
// Stopped mid-way through section
$string .= $bottom_string.$br;
}
return $string;
}
Чтобы воспользоваться им, просто позвоните по номеру paging_from_multi_array()
функция:
echo paging_from_multi_array($A);
Таким образом, если номер страницы или количество отображаемых на странице не задано, по умолчанию будут использоваться значения, установленные в первой строке paging_from_multi_array()
(в настоящее время страница 1 и 3 на странице).
Также обратите внимание на строки под /* Formatting Elements */
чтобы установить элементы для вывода (например:тот '...'
до и после каждого сегмента.
Другие советы
Без «общего» расчета это должна быть простая нумерация страниц (путем объединения подмассивов и разбивки на страницы в большом массиве).Но на самом деле «всего» не имеет ничего общего с самой нумерацией страниц.Поэтому я рекомендую сначала забыть «общее количество» для разбивки на страницы, а затем вставить его в подходящее место позже.
Моя идея начинается с создания такого массива слияния:
$B = array(
0=>1,
1=>2
0=>3,
1=>5,
2=>2
0=>3,
1=>1,
2=>6,
3=>6
}
И еще один массив для отслеживания начала каждого подмассива $A в массиве слияния $B:
$C = {0, 2, 5}
Тогда я могу сделать нумерацию страниц довольно просто, как обычно.Что касается «итого», мы можем использовать исходный массив A для его вычисления, а затем вставить в соответствующую позицию на основе C.
Для быстрого примера, на стр. 2, Max-P-Page = 3 от B, я получаю субмар. B1:B(смещение = 1, макс. на страницу = 3, из От B[3] до B[5])
$B1 = {
1=>5,
2=>2,
0=>3
}
Основываясь на $C={0,2,5}, с помощью простого цикла for мы можем получить $C[1] = 2 < 3 < 5 = 5 = $C[2] < length(B), поэтому здесь мы знаем, что покажем 2 подмассива (A[1] и a[2]);и мы также должны вычислить и вернуть total(A[1]).
Это моя идея.Думаю, так будет проще отслеживать ситуацию.