DEV Community

Shoaib Akbar
Shoaib Akbar

Posted on

Filtering and Customizing Arrays in PHP: A Step-by-Step Guide

We'll explore how to filter an array of books to display only those written by a specific author or by relaeseYear.

Array I'll use in examples

$books = [
[
'name' => 'Do Androids Dream of Electric Sheep',
'author' => 'Philip K. Dick',
'releaseYear' => 1968,
'purchaseURL' => 'http://example.com'
],
[
'name' => 'Project Hail Mary',
'author' => 'Andy Weir',
'releaseYear' => 2021,
'purchaseURL' => 'http://example.com'
],
[
'name' => 'The Martian',
'author' => 'Andy Weir',
'releaseYear' => 2011,
'purchaseURL' => 'http://example.com'
]
];

We'll start with a basic foreach loop.

foreach($books as $book) {

    if($book['author'] === "Andy Weir") {
        echo "<a href='#'><li>". $book['name'] ."</li></a>";
    }
}
Enter fullscreen mode Exit fullscreen mode

Creating a Filter Function by Author and releaseYear

function filterByAuthor($books) {

    $filteredBooks = [];

    foreach($books as $book){

        if($book['author'] === "Andy Weir") {
            $filteredBooks[] = $book; 
        }

    }

    return $filteredBooks;

}

function filterByReleaseYear($books) {

    $filteredBooks = [];

    foreach($books as $book){

        if($book['releaseYear'] === 2011) {
            $filteredBooks[] = $book; 
        }

    }

    return $filteredBooks;

}

?>

    <ul>

        <?php 

            foreach(filterByAuthor($books) as $book) {

                echo "<a href='#'><li>". $book['name'] ."</li></a>";

            }

        ?>

    </ul>
Enter fullscreen mode Exit fullscreen mode

Creating a Generalized Filter Function to add more flexibility

function filter($items, $key, $value) {

    $filteredItems = [];

    foreach($items as $item){

        if($item[$key] === $value) {
            $filteredItems[] = $item; 
        }

    }

    return $filteredItems;

}

$filterByAuthor = filter($books, 'author', 'Andy Weir');
$filteredByReleaseYear = filter($books, 'releaseYear', 2011);

?>

    <ul>

        <?php 

            foreach($filterByAuthor as $book) {

                echo "<a href='#'><li>". $book['name'] ."</li></a>";

            }

        ?>

    </ul>
Enter fullscreen mode Exit fullscreen mode

Using Anonymous Functions for Filtering to add even more flexibility to the conditional statement


function filter($items, $fn) {

    $filteredItems = [];

    foreach($items as $item){

        if($fn($item)) {
            $filteredItems[] = $item; 
        }

    }

    return $filteredItems;

}

$filterByAuthor = filter($books, function($book){

    return $book['author'] === 'Andy Weir';

});

$filteredByReleaseYear = filter($books, function($book){
    return $book['releaseYear'] >= 2000;
});

?>

    <ul>

        <?php foreach($filterByAuthor as $book) : ?>

                <a href='#'><li> <?= $book['name']; ?> </li></a>

            <?php endforeach; ?>

    </ul>    

    <ul>

        <?php foreach($filteredByReleaseYear as $book) : ?>

                <a href='#'><li> <?= $book['name']; ?> </li></a>

            <?php endforeach; ?>

    </ul>
Enter fullscreen mode Exit fullscreen mode

PHP build-in array_filter() solves this exactly!

$filterByAuthor = array_filter($books, function($book){

    return $book['author'] === 'Andy Weir';

});

$filteredByReleaseYear = array_filter($books, function($book){
    return $book['releaseYear'] >= 1950;
});

?>

    <ul>

        <?php foreach($filterByAuthor as $book) : ?>

                <a href='#'><li> <?= $book['name']; ?> </li></a>

            <?php endforeach; ?>

    </ul>    

    <ul>

        <?php foreach($filteredByReleaseYear as $book) : ?>

                <a href='#'><li> <?= $book['name']; ?> </li></a>

            <?php endforeach; ?>

    </ul>
Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
publicvar profile image
Nicolas LUDOVIC

Since PHP 7.4 you can use arrow function. It will make your filter more readable.

//Before
array_filter($books, function($book){
    return $book['releaseYear'] >= 1950;
});

//After
array_filter($books, fn ($book) => $book['releaseYear'] >= 1950);
Enter fullscreen mode Exit fullscreen mode
Collapse
 
shoiabakbar profile image
Shoaib Akbar

yes true, thanks for your value addition