2012-03-14 22 views
6

¿Cómo puedo obtener los últimos 5 elementos de una matriz PHP?Obteniendo los últimos 5 elementos de una matriz php

La matriz se genera dinámicamente mediante el resultado de la consulta MySQL. la longitud no es fija. Si la longitud es < = 5, obtenga todo lo demás la última 5.

Intenté con la función de PHP como last() y array_pop() pero solo dan el último elemento.

Ayúdame a solucionarlo.

+1

Por favor, mostrar en el código, la matriz generada dinámicamente que no tiene longitud. –

Respuesta

19

Necesita array_slice, que hace exactamente esto.

$items = array_slice($items, -5); 

-5 significa "comenzará a las cinco elementos antes del final de la matriz".

+0

+1 Sí, exactamente. – Josh

+0

¿Cuál sería el comportamiento si '$ items' solo tuviera, digamos, 3 elementos? – xbonez

+0

NO funciona. Dijo que la matriz es dinámica –

5

array_pop() 5 veces en un ciclo? Si el valor devuelto es null, ha agotado la matriz.

$lastFive = array(); 

for($i=0;$i < 5;$i++) 
{ 
    $obj = array_pop($yourArray); 

    if ($obj == null) break; 
    $lastFive[] = $obj; 
} 

Después de ver las otras respuestas, tengo que admitir array_slice() parece más corto y más fácil de leer.

0

Es un uso simple y array_slicecount()

$arraylength=count($array); 

    if($arraylength >5) 
     $output_array= array_slice($array,($arraylength-5),$arraylength); 
    else 
     $output_array=$array; 
+0

'count()' no es necesario. – Josh

0

sólo quiero extender la pregunta un poco. ¿Qué ocurre si bucles en un archivo grande y desea mantener las últimas 5 líneas o 5 elementos de una posición actual? Y no desea mantener un gran conjunto en una memoria y tener problemas con el rendimiento de array_slice.

Esta es una clase que implementa la interfaz ArrayAccess.

Obtiene la matriz y el límite de buffer deseado.

se puede trabajar con la clase de objeto como si fuera un array pero mantendrá automáticamente sólo 5 últimos elementos

<?php 
class MyBuffer implements ArrayAccess { 
    private $container; 
    private $limit; 

    function __construct($myArray = array(), $limit = 5){ 
     $this->container = $myArray; 
     $this->limit = $limit; 
    } 
    public function offsetSet($offset, $value) { 
     if (is_null($offset)) { 
      $this->container[] = $value; 
     } else { 
      $this->container[$offset] = $value; 
     } 
     $this->adjust(); 
    } 

    public function offsetExists($offset) { 
     return isset($this->container[$offset]); 
    } 

    public function offsetUnset($offset) { 
     unset($this->container[$offset]); 
    } 

    public function offsetGet($offset) { 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
    public function __get($offset){ 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
    private function adjust(){ 
     if(count($this->container) == $this->limit+1){ 
      $this->container = array_slice($this->container, 1,$this->limit); 
     } 
    } 
} 


$buf = new MyBuffer(); 
$buf[]=1; 
$buf[]=2; 
$buf[]=3; 
$buf[]=4; 
$buf[]=5; 
$buf[]=6; 

echo print_r($buf, true); 

$buf[]=7; 
echo print_r($buf, true); 


echo "\n"; 
echo $buf[4]; 
Cuestiones relacionadas