Có nhiều cách khác để lặp qua một mảng các đối tượng trong PHP đơn giản để thực hiện chuyển đổi và/hoặc lọc dữ liệu hơn là sử dụng các hàm mảng tích hợp do ngôn ngữ cung cấp
Mặc dù các hàm này rất nhiều và có thể sẽ giúp bạn đạt được các thao tác bạn đã nghĩ trong khi lặp qua danh sách các phần tử, nhưng chúng bị giới hạn bởi thực tế là các mảng PHP không được nhập. Điều đó có nghĩa là hầu như mọi lúc bạn sẽ phải thực hiện một số kiểu kiểm tra trước khi tiếp tục với logic của mã của mình. Điều này có thể dẫn đến rất dài dòng và, hãy đối mặt với nó, mã không dễ bảo trì và dễ đọc
Có một cách để đạt được tính dễ đọc và hiệu quả trong các vòng lặp foreach
của bạn đi qua một tập hợp các đối tượng. vòng lặp
Giao diện Iterator
cho phép bạn xác định hành vi PHP tùy chỉnh khi các đạo cụ của một thể hiện lớp nhất định được lặp lại ở mọi giai đoạn của vòng lặp foreach
Việc triển khai giao diện đó trên một lớp sẽ dẫn đến một trình lặp bên trong, vì logic lặp được triển khai bởi các phương thức của chính lớp đó
Khi sử dụng giao diện này, bạn sẽ cần triển khai
- current[]
, lấy mục hiện được lặp lại
- key[]
, nhận khóa mục hiện được lặp lại
-
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
0 , được sử dụng để di chuyển đến vị trí tiếp theo trong lần lặp-
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
1, tua lại vị trí bắt đầu lặp lại-
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
2, cho bạn biết nếu vị trí hiện tại có giá trịThông thường, bạn sẽ không cần tự triển khai giao diện Iterator
cho các tác vụ phổ biến hàng ngày không quá cụ thể về logic nghiệp vụ [ví dụ: lặp qua các tệp trong một thư mục]. Đối với loại nhiệm vụ chung này, PHP cung cấp các trình vòng lặp được xác định trước sẽ giúp cuộc sống của bạn dễ dàng hơn
Trong bài đăng này, chúng tôi sẽ xem xét hai trình vòng lặp tích hợp PHP
- lớp
4class IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
- lớp
5class IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
Với
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
4, bạn có thể dễ dàng bỏ đặt hoặc sửa đổi các giá trị và khóa khi lặp qua các mảng và đối tượng, như trong =>// we assume that instances 1 to 4 were created earlier
$myList = new \ArrayIterator[];
$myList->append[$instance1];
$myList->append[$instance2];
$myList->append[$instance3];
$myList->append[$instance4];
echo $myList->count[]; // gives you the size of your list
while[$myList->valid[]] { // you'll recognize here one of the implemented methods from `Iterator` interface
$instanceItem = $myList->current[];
// do something with instance keys/values here
$myList->next[];
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Mặc dù điều này khá gọn gàng, nhưng
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
4 thể hiện nhiều khả năng hơn khi được sử dụng với các trình vòng lặp khác, chẳng hạn như class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
5Lớp trừu tượng
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
5 cho phép tạo các lớp bộ lọc mà sau đó có thể được sử dụng trong các vòng lặp foreach
để truy xuất các giá trị dựa trên một điều kiện trong một lần lặp một cách thuận tiện; . //www. php. net/manual/en/class. bộ lọc. php]Xem ví dụ bên dưới =>
Hãy phá vỡ điều này
- chúng tôi muốn tạo một lớp bộ lọc ví dụ sẽ chỉ nhận các số là bội số của một biến int động trong danh sách
4;class IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
- lớp bộ lọc này mở rộng lớp tích hợp PHP của chúng tôi
5class IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
- nó có một thành viên
4 sẽ là biến mà chúng tôi sẽ kiểm tra trong quá trình lọc của mình$myList = new \ArrayIterator[]; $myList->append[1]; $myList->append[2]; $myList->append[3]; $myList->append[4]; $myList->append[5]; $myList->append[6]; $myList->append[7]; $myList->append[8]; $myList->append[9]; $myList->append[10];
- nó gọi phương thức khởi tạo chính là
5 và triển khai phương thứcclass IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
1 theo yêu cầu$myList = new \ArrayIterator[]; $myList->append[1]; $myList->append[2]; $myList->append[3]; $myList->append[4]; $myList->append[5]; $myList->append[6]; $myList->append[7]; $myList->append[8]; $myList->append[9]; $myList->append[10];
class IsMultipleOfFilter extends \FilterIterator {
private int $_filter;
public function __construct[\Iterator $iterator, int $filter] {
parent::__construct[$iterator];
$this->_filter = $filter;
}
public function accept[]: bool {
return $this->current[] % $this->_filter === 0;
}
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Bây giờ chúng ta đã có bộ lọc sẵn sàng, hãy tạo một danh sách [các số trong trường hợp của chúng ta] sẽ được lọc =>
$myList = new \ArrayIterator[];
$myList->append[1];
$myList->append[2];
$myList->append[3];
$myList->append[4];
$myList->append[5];
$myList->append[6];
$myList->append[7];
$myList->append[8];
$myList->append[9];
$myList->append[10];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Sau đó, hãy tạo một phiên bản bộ lọc của chúng ta, điều này sẽ dẫn đến một danh sách được lọc, bằng cách chuyển vào danh sách
4 của chúng ta và bộ lọc để chỉ nhận các số chẵn, chẳng hạn [số 2] =>class IsMultipleOfFilter extends \FilterIterator { private int $_filter; public function __construct[\Iterator $iterator, int $filter] { parent::__construct[$iterator]; $this->_filter = $filter; } public function accept[]: bool { return $this->current[] % $this->_filter === 0; } }
$myFilteredList = new IsMultipleOfFilter[$myList, 2];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
- Hãy kiểm tra xem mọi thứ có hoạt động như mong đợi không bằng cách lặp lại các phần tử trong danh sách đã lọc của chúng ta =>
foreach [$myFilteredList as $item] {
echo $item.PHP_EOL;
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Đó là nó. bạn đã có được các tùy chọn lặp mạnh mẽ mới chỉ bằng cách hiểu trường hợp sử dụng đơn giản này;
Lúc đầu, trình lặp và trình tạo có thể đáng sợ, vì vậy tôi hy vọng ví dụ này sẽ cho phép bạn tự tin hơn khi sử dụng các cấu trúc này