Trình lặp mảng trong PHP là gì?

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
    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
  • 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;
        }
    }
    
    5

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;
    }
}
5

Lớ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
    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;
  • lớp bộ lọc này mở rộng lớp tích hợp PHP của chúng tô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;
        }
    }
    
    5
  • nó có một thành viên
    $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);
    
    4 sẽ là biến mà chúng tôi sẽ kiểm tra trong quá trình lọc của mình
  • nó gọi phương thức khởi tạo chính là
    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 và triển khai phương thứ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);
    
    1 theo yêu cầu

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
    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 của chúng ta và bộ lọc để chỉ nhận các số chẵn, chẳng hạn (số 2) =>

$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

Lặp mảng trong PHP là gì?

Các hàm Iterator. Mỗi mảng PHP theo dõi phần tử hiện tại mà bạn đang làm việc ; . PHP có các chức năng để thiết lập, di chuyển và đặt lại trình vòng lặp này.

Sự khác biệt giữa ArrayIterator và ArrayObject trong PHP là gì?

Sự khác biệt chính giữa 2 cái này là ở các phương thức mà các lớp có. ArrayIterator triển khai giao diện Iterator cung cấp cho nó các phương thức liên quan đến phép lặp/lặp qua các phần tử. ArrayObject có một phương thức gọi là exchangeArray hoán đổi mảng bên trong của nó với một mảng khác

Trình lặp mảng đối tượng là gì?

Phương thức @@iterator của một đối tượng Array thực hiện giao thức có thể lặp lại và cho phép các mảng được sử dụng bởi hầu hết các cú pháp mong đợi có thể lặp lại , chẳng hạn như . vòng lặp. Nó trả về một trình lặp mang lại giá trị của từng chỉ mục trong mảng.

Trình lặp PHP quan trọng như thế nào trong một ứng dụng?

Trình lặp khuyến khích bạn xử lý dữ liệu lặp lại, thay vì lưu vào bộ nhớ đệm . Mặc dù có thể thực hiện điều này mà không cần trình vòng lặp, nhưng phần trừu tượng mà chúng cung cấp che giấu việc triển khai khiến chúng thực sự dễ sử dụng.