2015-01-21 15 views
5

Tôi đang sử dụng end() để đặt con trỏ bên trong của một mảng thành phần tử cuối cùng của nó. Sau đó, tôi đang sử dụng key() để lấy chìa khóa của phần tử cuối cùng đó.Con trỏ nội bộ mảng trong PHP là gì?

Ví dụ:

$array = ('one' => 'fish', 'two' => 'fish', 'red' => 'fish', 'blue' => 'fish'); 
end($array) 
$last_key = key($array); 

Điều duy nhất mà tôi không hiểu là những gì các con trỏ nội bộ của một mảng chính xác. Ai đó có thể giải thích cho tôi? Tôi đã cố gắng nhưng không thể tìm được lời giải thích.

Ngoài ra, cách đặt con trỏ bên trong của mảng ảnh hưởng đến mảng đó?

+3

[Đọc tốt liên quan] (http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html). – kojiro

Trả lời

10

Có triển khai nội bộ cho "mảng" trong PHP "đằng sau hậu trường", được viết bằng C. Triển khai này xác định chi tiết về cách dữ liệu mảng thực sự được lưu trữ trong bộ nhớ, cách hoạt động của mảng, cách chúng có thể truy cập v.v. Một phần của việc thực hiện C này là một "con trỏ mảng", mà chỉ đơn giản là trỏ đến một chỉ mục cụ thể của mảng. Trong mã PHP rất đơn giản, đó là một cái gì đó như thế này:

class Array { 

    private $data = []; 
    private $pointer = 0; 

    public function key() { 
     return $this->data[$this->pointer]['key']; 
    } 

} 

Bạn không có quyền truy cập trực tiếp tới này con trỏ mảng từ mã PHP, bạn chỉ có thể sửa đổi và ảnh hưởng đến nó gián tiếp sử dụng các PHP functions như end, reset, each vv Nó là cần thiết để làm cho những chức năng này hoạt động; nếu không bạn không thể lặp lại một mảng bằng cách sử dụng next(), bởi vì nó sẽ ghi nhớ mục nhập "tiếp theo" ở đâu?

+1

Thú vị nếu bạn không biết điều này và bắt đầu lặp qua một mảng bên trong một vòng lặp trên cùng một mảng. –