Dividere Array in Pagine con una Classe in PHP

29 Dicembre 2015 di Daniele Frulla


Diverse volte ti sarà capitato di dover dividere il risultato di una SELECT in pagine, oppure un array in diversi sotto array. Questo è necessario nella programmazione parallela, o anche per presentare a video diverse pagine di un unico risultato.

Paginazione

In PHP ci viene in aiuto la funzione array_chunk. Essa divide un array in tanti arrays in base al valore della dimensione che gli viene passata nella funzione.

Vorrei farti vedere una semplice classe in cui è implementata anche la funzione array_chunk. La classe sottostante permette di ritornare la pagina di un array. Se la pagina non esiste, il risultato sarà una eccezione.

Come per array_chunk bisogna fare attenzione alla dimensione delll’array perché potrebbe restituire messaggi di errori a causa della poca memoria del server.

Per esempio, se proverai a creare un array di 900000 elementi di interi vedrai che non saranno sufficienti 120Mb di memoria. In tal caso occorrerà utilizzare altre tipologie di dati.

Se si utilizza una versione PHP > 5.3.0 la classe SplFixedArray risparmierà molti Mb di memoria e potrai elaborare più dati con un maggiore risparmio di memoria.

[php]
class Pagination {
private $elements;
private $keys;
private $items;

/**
*
* @param array $elements
* @param number $items
*/
public function __construct( array $elements, $items = 100 ) {
$this->elements = array_values($elements);
$this->keys = array_keys($elements);
$this->setItems( $items );
}

public function setItems( $items = 100 ) {
$this->items = intval( $items );
}

public function getItems( ) {
return $this->items;
}

/**
* Return an array of values
*
* @param integer $numPage
* @return array
* @throws
*/
public function getPage( $numPage = 1 ) {
$numPage = intval($numPage);
if ( $numPage > $this->getTotalPages() )
throw new \Exception(‘Page not found’, 401 );

if ( $numPage == 0 )
$numPage = 1;

$start = $this->getItems() * $numPage;
$c = 0; $result=array();
while ( $c < $this->getItems() ) {
$result[$this->keys[$start+$c]] = $this->elements[$start+$c];
$c++;
}
return $result;
}

/**
* Return all pages withi array chunk
*
* @param array $array
* @param integer $items
* @param boolean $index
* @return array
*/
public static function getPages( array $array, $items, $index = false ) {
return array_chunk( $array , $items, $index );
}

/**
* Return the total pages
*
* @return integer
*/
public function getTotalPages() {
return ceil( $this->totals()/$this->getItems() );
}

public function totals() {
return count($this->elements);
}
}
[/php]

 


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


Copyright di Caterina Mezzapelle Part. I.V.A. 02413940814 - R.E.A. 191812