PHP Iterators for walking through data structures – FastTips

Valerio Barbera
php-iterators-inspector

PHP Iterators are essential tools for efficiently traversing and manipulating data structures like arrays, objects, and more. They provide a clean and memory-efficient way to work with large datasets without loading the entire dataset into memory at once. In this tutorial, we will explore PHP iterators and how to use them for walking through various data structures.

Introduction to PHP Iterators

An iterator is an object that implements the Iterator or IteratorAggregate interface. It allows you to loop through a collection of items one at a time, without the need to load the entire collection into memory. This is especially useful when dealing with large lists, as it conserves memory and improves performance.

Built-in PHP Iterators

PHP provides several built-in iterators for common data structures. Later in the article we will also see how to create custom iterator classes. Let’s explore the built in classes:

ArrayIterator

The ArrayIterator is one of the simplest iterators and is used for traversing arrays. Here’s an example:

$array = [1, 2, 3, 4, 5];
$iterator = new ArrayIterator($array);

foreach ($iterator as $item) {
    echo $item . " ";
}
// Output: 1 2 3 4 5

DirectoryIterator

The DirectoryIterator is useful for iterating through the files and directories in a directory.

$directory = new DirectoryIterator('/path/to/directory');

foreach ($directory as $fileInfo) {
    echo $fileInfo->getFilename() . PHP_EOL;
}

RecursiveIteratorIterator

The RecursiveIteratorIterator is used for recursively iterating through nested iterators, such as arrays with sub-arrays. It’s often used with the RecursiveArrayIterator.

$nestedArray = [
    'item1',
    'item2',
    ['subitem1', 'subitem2'],
    'item3',
    ['subitem3' => ['subsubitem1', 'subsubitem2']],
];

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($nestedArray));

foreach ($iterator as $item) {
    echo $item . PHP_EOL;
}

Creating Custom Iterators

You can also create custom iterators by implementing the Iterator or IteratorAggregate interface. This is useful when you want to traverse your own data structures:

class MyIterator implements Iterator 
{
    private $data = [1, 2, 3];

    private $position = 0;

    public function current() 
    {
        return $this->data[$this->position];
    }

    public function key() 
    {
        return $this->position;
    }

    public function next() 
    {
        $this->position++;
    }

    public function rewind() 
    {
        $this->position = 0;
    }

    public function valid() 
    {
        return isset($this->data[$this->position]);
    }
}

// How to use it in your code

$myIterator = new MyIterator();

foreach ($myIterator as $key => $value) {
    echo "Key: $key, Value: $value" . PHP_EOL;
}

Filtering Iterators

Filtering iterators are a subset of PHP iterators that allow you to iterate over data structures while applying filters or conditions to include or exclude elements. This selective processing can help streamline your code and improve performance by reducing unnecessary data processing.

PHP provides several built-in filtering iterators. Let’s explore a few of them.

FilterIterator

The FilterIterator is a base class for creating custom filtering iterators. You extend it and override the accept method to implement your filtering logic.

class EvenFilter extends \FilterIterator 
{
    public function accept() 
    {
        // Filter even numbers
        return $this->current() % 2 === 0;
    }
}

$array = [1, 2, 3, 4, 5, 6];
$iterator = new EvenFilter(new ArrayIterator($array));

foreach ($iterator as $item) {
    echo $item . " "; // Output: 2 4 6
}

RegexIterator

The RegexIterator allows you to filter elements based on regular expressions. It’s commonly used for filtering files in a directory.

$files = new \DirectoryIterator('/path/to/files');
$regexIterator = new \RegexIterator($files, '/\.txt$/');

foreach ($regexIterator as $fileInfo) {
    echo $fileInfo->getFilename() . PHP_EOL;
    // Output: Only files with .txt extension
}

CallbackFilterIterator

The CallbackFilterIterator lets you define custom filtering logic using a callback function. This provides flexibility to filter elements based on complex conditions.

$array = [10, 20, 30, 40, 50];

$callbackFilter = new \CallbackFilterIterator(
    new \ArrayIterator($array),
    function ($current, $key, $iterator) {
        // Filter elements greater than 30
        return $current > 30;
    }
);

foreach ($callbackFilter as $item) {
    echo $item . " "; // Output: 40 50
}

Creating Custom Filtering Iterators

To create a custom filtering iterator, you can extend the FilterIterator class and implement the accept method to define your filtering logic. This is particularly useful when you need to filter elements from your own data structures or objects:

class MyCustomFilter extends \FilterIterator
{
    public function accept(): bool 
    {
        // Your logic here...
    }
}

You can use filtering iterators with arrays, as shown in the examples above. This is useful for quickly selecting and processing specific elements. They are also commonly used for working with directories and files. You can filter files by extension, modification date, size, or any other criteria that your application requires.

New To Inspector? Monitor your application for free

Inspector is a Code Execution Monitoring tool specifically designed for software developers. You don’t need to install anything in the infrastructure, just install the composer package and you are ready to go.

Unlike other complex, all-in-one platforms, Inspector is super easy, and PHP friendly. You can try our Laravel or Symfony package.

If you are looking for effective automation, deep insights, and the ability to forward alerts and notifications into your messaging environment try Inspector for free. Register your account.

Or learn more on the website: https://inspector.dev

Related Posts

I Can’t Tell You What AI Will Return. Here Is How to Work It Out Yourself.

Everyone selling AI promises a return. Nobody can prove one. Here is the arithmetic a decision maker can run in a week, with numbers already sitting in the company. Before writing this I went looking for a number. We build tools that developers and companies use to put AI agents inside applications that are already

Parallel Evaluations in Neuron AI: PHP First Testing Loop for AI Agents

Some of the most useful features in Neuron AI did not come from a roadmap meeting, they came from someone hitting a wall in their own project and opening an issue about it. That is exactly how parallel execution for evaluations was born. A community member filed issue #485, describing the problem: the evaluation command

Debug Your PHP App From Your Phone, Through Your AI Assistant

Last month I was at dinner when my phone buzzed with an Inspector alert: an error on one of our own endpoints. The old routine kicks in automatically at that point. Open the dashboard on a screen too small for it, squint at a stack trace, tell yourself “I’ll look properly when I’m back at