2011-01-25 18 views
9

Tengo una matriz con los datos que quiero mostrar con la paginación.¿Cómo hacer una paginación desde una matriz?

$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 
) 

tengo tratar algo como esto

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. 
    } 
} 

Quiero hacer una paginación para obtener el resultado esperado de esta manera:

Si defino $show_per_page = 2; continuación pagination($display_array, 1); salidas:

0602 xxx2 
0602 xxxx3 
Total:5 

Y paganation($display_array, 2); salidas:

0602 xxx3 
0602 saa4 
Total:7 

Si defino $show_per_page = 3;, entonces pagination($display_array, 1); salidas:

0602 xxx2 
0602 xxxx3 
Total: 5 
0602 xxx3 

Y paganation($display_array, 2); salidas:

0602 saa4 
Total:7 

Si defino $show_per_page = 4; salidas:

0602 xxx2 
0602 xxxx3 
Total:5 
0602 xxx3 
0602 saa4 
Total: 7 
+1

Entonces, ¿cuál es tu pregunta? ¿O solo buscas a alguien para hacer tu trabajo? –

+0

¿Puedes describir qué es lo que quieres manipular? – Gajahlemu

+0

$ end = $ start + $ show_per_page; ¿seguramente? –

Respuesta

15

Tener un vistazo a esto:

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); 

La salida es:

// 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 

La salida de $ show_per_page = 3 es diferente a la suya, pero no estoy seguro de lo que esperas? ¿Desea recuperar todo lo que queda (es decir, '0602 saa4' y 7) más un elemento anterior (es decir, '0602 xxx3')?

+0

para otro caso, está bien, pero tengo prueba, $ show_per_page = 4 No obtuve el total. – kn3l

+0

y $ show_per_page = 1 Tengo dos pantallas de entris, de hecho solo debe una entrada. – kn3l

+0

Y por qué $ offset = $ show_per_page + 1; Porque no siempre es así .Marcin – kn3l

0

$ output = array_slice ($ inputArray, $ page-1, $ showPerPage); $ output contendrá el intervalo deseado. $ total = sizeof ($ inputArray);/el total de elementos de la matriz/

+1

por qué total = sizeof ($ inputArray) ;? – kn3l

4

Uso array_chunk:

function paginate($array, $pageSize, $page = 1) 
{ 
    $pages = array_chunk($array, $pageSize); 
    return $page > sizeof($pages) ? [] : $pages[$page - 1]; 
} 

o utilizar una versión más limpia de respuesta de Marcin:

function paginate($array, $pageSize, $page = 1) 
{ 
    $page = $page < 1 ? 1 : $page; 
    $start = ($page - 1) * $pageSize; 
    return array_slice($array, $start, $pageSize); 
} 
+0

la idea de array_chunk es muy agradable, gracias por eso. . . ahora para construir un sistema de menú basado en esto. :) –

+1

@MichaelTunnell de nada. – PHPst

Cuestiones relacionadas