Iterable và iterator trong PHP
- 15-03-2023
- Toanngo92
- 0 Comments
Một iterable trong PHP là một loại tham số có thể được lặp với một vòng lặp foreach. iterable có thể được sử dụng làm kiểu dữ liệu cho đối số hàm và cũng như giá trị trả về của hàm.
Ví dụ sử dụng iterable làm tham số:
<html>
<body>
<?php
function displayIterable(iterable $testIterable)
{
foreach ($testIterable as $item) {
echo $item;
}
}
$arrl = ["1", "2", "3"];
displayIterable($arrl);
?>
</body>
</html>
Ví dụ sử dụng iterable khi return:
<html>
<body>
<?php
function getIterable(): iterable
{
return ["x", "y", "z"];
}
$testIterable = getIterable();
foreach ($testIterable as $alpha) {
echo $alpha;
}
?>
</body>
</html>
Tất cả các mảng là iterables. Do đó, bất kỳ mảng nào cũng có thể được sử dụng làm đối số của một phương thức. Tuy nhiên, nó yêu cầu một iterable.
PHP chứa một interface được gọi là iterator, interface này có thể được sử dụng làm đối số của hàm yêu cầu iterable.
iterator chứa danh sách các mục và cung cấp các hàm để lặp qua. Nó cũng chứa một con trỏ tới một trong các phần tử trong danh sách. Mỗi mục trong danh sách phải có một khóa để có thể định vị mục đó.
Một số phương thức của iterator:
current() | Nó trả về Phần tử mà con trỏ hiện đang trỏ tới. Nó có thể là bất kỳ kiểu dữ liệu nào |
key() | Nó trả về khóa được liên kết với phần tử hiện tại trong danh sách. Kiểu dữ liệu của khóa chỉ có thể là integer, float, Boolean hoặc string. |
next() | Nó di chuyển con trỏ đến phần tử tiếp theo trong danh sách. |
rewind() | Nó di chuyển con trỏ đến đầu (phần tử đầu tiên) của danh sách. |
valid() | Nếu con trỏ bên trong được thao tác để trỏ đến một phần tử không hợp lệ của danh sách (ví dụ: nếu next() được gọi ở cuối danh sách, thì hàm này sẽ trả về false. Trong bất kỳ trường hợp nào khác, nó trả về true. |
Ví dụ:
<?php
class TestIterator implements Iterator{
private $alpha = [];
private $pointer = 0;
public function __construct($arr){
$this->alpha = array_values($arr);
}
// comment in php 8.1
#[\ReturnTypeWillChange]
public function rewind(){
$this->pointer = 0;
}
#[\ReturnTypeWillChange]
public function current(){
return $this->alpha[$this->pointer];
}
#[\ReturnTypeWillChange]
public function key(){
return $this->index;
}
#[\ReturnTypeWillChange]
public function next(){
$this->pointer++;
}
#[\ReturnTypeWillChange]
public function valid(){
return $this->pointer < count($this->alpha);
}
public function duyet(){
foreach($this->alpha as $key => $value){
echo $value;
}
}
}
function printIter(iterable $arr){
$arr->duyet();
}
$myarr = new TestIterator(['a','b','c']);
// printIter($myarr);
echo $myarr->current();
$myarr->next();
echo $myarr->current();
$myarr->next();
echo $myarr->current();
$myarr->rewind();
echo $myarr->current();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>