5 τρόποι για να φιλτράρετε ένα array στην php
- February 11th, 2012
- By Γιάννης Βρέντζος
- Write comment
Αρκετές φορές χρειάζεται να φιλτράρουμε ένα 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"
);
Οι χρόνοι για την κάθε περίπτωση ήταν:
- array_filter preg_match: 0.0010430812835693
- foreach preg_match: 0.00051212310791016
- array_filter strpos: 0.00095891952514648
- foreach strpos: 0.00039100646972656
- foreach strpos με unset: 0.00040817260742188
Το συμπέρασμα είναι ότι οι λύσεις, στις οποίες χρησιμοποιήθηκε η foreach, χρειάστηκαν περίπου το μισό χρόνο εκτέλεσης σε σχέση με αυτές που χρησιμοποιήθηκε η array_filter.



