Αρκετές φορές χρειάζεται να φιλτράρουμε ένα array στην php και να κρατήσουμε μόνο τα στοιχεία που μας ενδιαφέρουν. Για να το πετύχουμε αυτό, μπορούμε να χρησιμοποιήσουμε διάφορους τρόπους, κάποιοι από τους οποίους είναι οι παρακάτω:

1ος τρόπος

function ArrayFilter1($array, $pattern)
{
        return array_filter($array, function($value) use ($pattern) { return preg_match($pattern, $value); });
}

2ος τρόπος

function ArrayFilter2($array, $pattern)
{
        $res = array();
        foreach($array as $a)
                if (preg_match($pattern, $a))
                        $res[] = $a;
        return $res;
}

3ος τρόπος

function ArrayFilter3($array, $find)
{
        return array_filter($array, function($value) use ($find) { return strpos($value, $find) !== false; });
}

4ος τρόπος

function ArrayFilter4($array, $find)
{
        $res = array();
        foreach($array as $a)
                if (strpos($a, $find) !== false)
                        $res[] = $a;
        return $res;
}

5ος τρόπος

function ArrayFilter5($array, $find)
{
        foreach($array as $k => $a)
                if (strpos($a, $find) === false)
                        unset($array[$k]);
        return $array;
}

Στις περιπτώσεις 1, 3 και 5, τα array keys διατηρούνται, ενώ στις περιπτώσεις 2 και 4 χάνονται και ξεκινούν από το 0.

Τι γίνεται όμως με την απόδοση κάθε μιας από τις παραπάνω περιπτώσεις; Έχοντας ως είσοδο τα παρακάτω δοκιμαστικά δεδομένα, εκτελέσαμε 10 φορές την κάθε περίπτωση αναζητώντας αρχεία με κατάληξη .php

$array = array
(
        "l1" => "styles.css",
        "l2" => "gallerystyle.css",
        "l3" => "index.php",
        "l4" => "javascript:;",
        "l5" => "javascript:;",
        "l6" => "about.php",
        "l7" => "gallery.php?id=33",
        "l8" => "gallery.php?id=30",
        "l9" => "gallery.php?id=21"
);

Οι χρόνοι για την κάθε περίπτωση ήταν:

  1. array_filter preg_match: 0.0010430812835693
  2. foreach preg_match: 0.00051212310791016
  3. array_filter strpos: 0.00095891952514648
  4. foreach strpos: 0.00039100646972656
  5. foreach strpos με unset: 0.00040817260742188

Το συμπέρασμα είναι ότι οι λύσεις, στις οποίες χρησιμοποιήθηκε η foreach, χρειάστηκαν περίπου το μισό χρόνο εκτέλεσης σε σχέση με αυτές που χρησιμοποιήθηκε η array_filter.