2012-03-14 92 views
6

Làm thế nào tôi có thể nhận được 5 phần tử cuối cùng của một mảng PHP.Lấy 5 phần tử cuối cùng của một mảng php

Mảng được tạo động bằng kết quả truy vấn MySQL. chiều dài không cố định. Nếu chiều dài < = 5 sau đó nhận được tất cả những gì khác cuối cùng 5.

Tôi đã thử với chức năng PHP như last()array_pop() nhưng chúng chỉ cung cấp phần tử cuối cùng.

Hãy giúp tôi giải quyết.

+1

Hãy thể hiện, trong mã, mảng tạo động mà không có chiều dài. –

Trả lời

19

Bạn cần array_slice, thực hiện chính xác điều này.

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

-5 có nghĩa là "bắt đầu năm phần tử trước khi kết thúc mảng".

+0

+1 Yup, chính xác. – Josh

+0

Điều gì sẽ là hành vi nếu '$ items' chỉ có, nói rằng, 3 yếu tố? – xbonez

+0

KHÔNG hoạt động. Tôi nói mảng là động –

5

array_pop() 5 lần trong vòng lặp? Nếu giá trị trả lại là null, bạn đã cạn kiệt mảng.

$lastFive = array(); 

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

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

Sau khi xem các câu trả lời khác, tôi phải thừa nhận array_slice() trông ngắn hơn và dễ đọc hơn.

0

Nó đơn giản sử dụng array_slicecount()

$arraylength=count($array); 

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

'count()' là không cần thiết. – Josh

0

Tôi chỉ muốn kéo dài câu hỏi một chút. Điều gì sẽ xảy ra nếu bạn lặp lại mặc dù một tệp lớn và muốn giữ 5 dòng cuối cùng hoặc 5 phần tử từ một vị trí hiện tại. Và bạn không muốn giữ mảng lớn trong bộ nhớ và gặp vấn đề với hiệu suất của array_slice.

Đây là lớp triển khai giao diện ArrayAccess.

Nó nhận được giới hạn bộ đệm mong muốn.

Bạn có thể làm việc với các đối tượng lớp như nó là một mảng nhưng nó sẽ tự động giữ CHỈ cuối cùng 5 yếu tố

<?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]; 
Các vấn đề liên quan