title besides title

 

Thursday, November 8, 2012

PHP : Arrays - [4.14] Finding Elements That Pass a Certain Test

4.14.1 Problem

You want to locate entries in an array that meet certain requirements.

4.14.2 Solution

Use a foreach loop:
$movies = array(...);

foreach ($movies as $movie) {
    if ($movie['box_office_gross'] < 5000000) { $flops[] = $movie; }
}
Or array_filter( ):
$movies = array(...);

function flops($movie) {
    return ($movie['box_office_gross'] < 5000000) ? 1 : 0;
}

$flops = array_filter($movies, 'flops');

4.14.3 Discussion

The foreach loops are simple; you scroll through the data and append elements to the return array that match your criteria.
If you want only the first such element, exit the loop using break :
foreach ($movies as $movie) {
    if ($movie['box_office_gross'] > 200000000) { $blockbuster = $movie; break; }
}
You can also return directly from a function:
function blockbuster($movies) {
    foreach ($movies as $movie) {
        if ($movie['box_office_gross'] > 200000000) { return $movie; }
    }
}
With array_filter( ), however, you first create a callback function that returns true for values you want to keep and false for values you don't. Using array_filter( ), you then instruct PHP to process the array as you do in the foreach.
It's impossible to bail out early from array_filter( ), so foreach provides more flexibility and is simpler to understand. Also, it's one of the few cases in which the built-in PHP function doesn't clearly outperform user-level code.