Intereting Posts
Автоматически включать недостающие функции? Итерации через определенное дерево каталогов и сохранение всех .ttf-файлов в массив в PHP Хорошая таблица php print_r Хранить его в сеансе или в базе данных запросов каждой загрузки страницы? Определите, где была вызвана функция с PHP Ошибка «function» mb_output_handler «не найден» в Laravel PHP tot MySQL загружает изображения не работает Невозможно переопределить заголовок содержимого в s3 Скопируйте все содержимое каталога в другое, используя php Использует microtime () для создания неудачных методов токена сброса пароля Является ли mysql_num_rows эффективной и / или стандартной практикой? Предупреждение: spl_object_hash () ожидает, что параметр 1 будет объектом, с сообщением Нужно регулярное выражение, чтобы добавить класс css в первый и последний элемент списка Как определить, перенаправляется ли URL на PHP? Не удалось отправить HTML-письма с помощью PHP mail ()

Получение последних 5 элементов массива php

Как я могу получить последние 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];