Paginar vector de resultados con PHP

Hace un tiempo me surgió el problema de paginar un vector (Array) de resultados de una búsqueda, por lo que busqué la forma de crear una función que me permitiera listar los items correspondientes, pasandole por parámetros el vector en cuestión, el límite de resultados a mostrar y la página solicitada.

He aquí mi solución (es una base, que necesita ser pulida, eso les dejo a ustedes Guiño )

paginar.php

Código :

function paginar($v, $l, $p) {

Primero que nada definimos la función junto con las variables que se han de pasar como parámetro, ahora bien, necesitamos saber cuales son las condiciones de inicio de nuestro paginador, tales como la cantidad de páginas a mostrar, en función de la longitud del vector y del límite de items a desplegar:

Código :

// DEFINIMOS LA CANTIDAD DE PÁGINAS
$paginas = ceil(count($v) / $l);

Ahora bien, si queremos mostrar cada item del vector $v necesitaremos recorrerlo con un bucle, pero… ¿desde dónde empezaríamos a mostrar y hasta dónde? Para ello necesitamos definir las condiciones de nuestro bucle recorredor como sigue:

Código :

// CONDICION DE INICIO
$inicio = ($p-1)*$l;
      
// CONDICION DE FINAL
$final = $p*$l;

Y ya estamos listos para empezar a recorrer el vector mostrando cada resultado dentro de un div de id="item" dentro del div de resultados. Debemos tener en cuenta que, si no existiera el item i-ésimo dentro del vector $v tenemos que dejar de listar items:

Código :

// MOSTRAMOS LOS ITEMS RESPECTIVOS
      echo '<div id="resultados">';
      for ($i=$inicio; $i<$final; $i++) {
         if (isset($v[$i]))
            echo "<div id=\"item\">$i.- $v[$i]</div>";
         else 
            break;
      }
      echo '</div>';

Listo, tenemos los resultados correspondientes a la página $p, pero necesitaríamos mostrar el total de páginas a modo de menú de hipervínculos para poder navegar entre los ítems. Para ello comprobaremos si nos encontramos en la primera pagina para no mostrar "Página anterior" o en la última para no mostrar "Página siguiente", además de no crear un vínculo a la misma página:

Código :

// LISTAMOS LAS PÁGINAS
      echo '<div id="paginas">';
      if ($p>1)
         echo "<a href=\"index.php?p=" . ($p-1) . "\">P&aacute;gina Anterior</a>&nbsp;-&nbsp;";
      
      for ($i=1; $i<=$paginas; $i++) {
         if ($i == $p)
            echo "<strong>$i</strong>&nbsp;";
         else 
            echo "<a href=\"index.php?p=$i\">$i</a>&nbsp;";
      }
      
      if ($p<$paginas)
         echo "&nbsp;-&nbsp;<a href=\"index.php?p=" . ($p+1) . "\">P&aacute;gina Siguiente&nbsp;</a>";
      echo '</div>';
return;
   }

Eso sería todo, para llamar a la función simplemente realizamos:

index.php

Código :

<?php
   $vector = array("hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau", "hola", "chau" );
   
   require ("paginar.php");
   
   if (isset($_GET[p]))
      $p = $_GET[p];
   else 
      $p=1;
      
   paginar($vector, 10, $p);
?>

Espero que les sirva de base para un desarrollo más complejo, saludos!

Pueden ver el ejemplo funcionando en http://www.reweb.com.ar/labs/paginarVector/

Enviar comentario

Posted in php

Deja una respuesta