Как я могу получить последние 5 элементов массива PHP.
Массив динамически генерируется результатом запроса MySQL. длина не фиксирована. Если длина <= 5, то получим все остальные последние 5.
Я пробовал с PHP-функциями, такими как last()
и array_pop()
но они дают только последний элемент.
Пожалуйста, помогите мне решить проблему.
Вам нужна array_slice
, которая делает именно это.
$items = array_slice($items, -5);
-5
означает «начать с пяти элементов до конца массива».
array_pop()
5 раз в цикле? Если возвращаемое значение равно null
, вы исчерпали массив.
$lastFive = array(); for($i=0;$i < 5;$i++) { $obj = array_pop($yourArray); if ($obj == null) break; $lastFive[] = $obj; }
После просмотра других ответов я должен признать, что array_slice()
выглядит короче и читабельнее.
array_slice
($array, -5)
должен делать трюк
Простое использование array_slice и count()
$arraylength=count($array); if($arraylength >5) $output_array= array_slice($array,($arraylength-5),$arraylength); else $output_array=$array;
Я просто хочу немного расширить вопрос. Что делать, если вы зацикливаете большой файл и хотите сохранить последние 5 строк или 5 элементов из текущей позиции. И вы не хотите хранить огромный массив в памяти и иметь проблемы с производительностью array_slice.
Это класс, реализующий интерфейс ArrayAccess.
Он получает массив и желаемый буферный лимит.
Вы можете работать с объектом класса, как с массивом, но он будет автоматически сохранять ТОЛЬКО последние 5 элементов
<?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];
с<?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];