Алгоритм раздельного отображения страниц по ...? - PullRequest
2 голосов
/ 17 февраля 2011

У $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"]);

У вас есть идея с функцией здесь? Или мог бы дать лучший алгоритм?

спасибо

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Это должно дать вам искомый вывод:

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     = '&nbsp;&nbsp;&nbsp;'; // 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 */ для установки элементов для вывода (например: '...' до и после каждого сегмента.

1 голос
/ 22 февраля 2011

Без вычисления "total" это должно быть простое разбиение на страницы (путем объединения подмассивов и разбивки на страницы в большом массиве).Но на самом деле «total» не имеет ничего общего с самим разбиением на страницы.Поэтому я рекомендую сначала забыть «общее» для разбивки на страницы, а затем вставить его в соответствующее место.

Моя идея начинается с создания массива слияния, подобного этому:

$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-per-page = 3B, я получаю подмассив 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]);и мы должны вычислить и вернуть итоговое значение (A [1]). </p>

Это моя идея.Я думаю, что было бы легче отслеживать.

...