array_filter

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

array_filterFiltrează elementele unui tablou utilizând o funcție de apel invers

Descrierea

array_filter ( array $array , callable $callback = ? , int $flag = 0 ) : array

Iterează prin fiecare valoare în tabloul array transmițând-o funcției callback. Dacă funcția callback întoarce true, valoarea curentă din array este întoarsă în array rezultant.

Cheile tabloului sunt păstrate și pot apărea lacune dacă array a fost indexat. Rezultatul array poate fi reindexat utilizând funcția array_values().

Parametri

array

Tabloul în care se iterează

callback

Funcția de apel invers utilizată

Dacă nu este furnizată nici o funcție callback, toate înregistrările vide din array vor fi eliminate. A se vedea funcția empty() pentru a afla modul cum PHP definește conținutul vid în acest caz.

flag

Fanionul ce determină ce argumente sunt transmise către callback:

  • ARRAY_FILTER_USE_KEY - transmite cheia ca unic argument pentru callback în loc de valoare
  • ARRAY_FILTER_USE_BOTH - transmite ambele - valoarea și cheia - ca argumente pentru callback, și nu doar valoarea
Valoarea implicită este 0 ceea ce va face ca valoarea să fie transmisă ca unic argument către callback.

Valorile întoarse

Întoarce tabloul filtrat.

Istoricul schimbărilor

Versiune Descriere
5.6.0 A fost adăugat parametrul opțional flag și constantele ARRAY_FILTER_USE_KEY și ARRAY_FILTER_USE_BOTH

Exemple

Example #1 Exemplu array_filter()

<?php
function odd($var)
{
    
// întoarce true dacă numărul întreg transmis este impar
    
return $var 1;
}

function 
even($var)
{
    
// întoarce true dacă numărul întreg transmis este par
    
return !($var 1);
}

$array1 = ['a' => 1'b' => 2'c' => 3'd' => 4'e' => 5];
$array2 = [6789101112];

echo 
"Odd :\n";
print_r(array_filter($array1"odd"));
echo 
"Even:\n";
print_r(array_filter($array2"even"));
?>

Exemplul de mai sus va afișa:

Odd :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Even:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

Example #2 array_filter() fără callback

<?php

$entry 
= [
    
=> 'foo',
    
=> false,
    
=> -1,
    
=> null,
    
=> '',
    
=> '0',
    
=> 0,
];

print_r(array_filter($entry));
?>

Exemplul de mai sus va afișa:

Array
(
    [0] => foo
    [2] => -1
)

Example #3 array_filter() cu flag

<?php

$arr 
= ['a' => 1'b' => 2'c' => 3'd' => 4];

var_dump(array_filter($arr, function($k) {
    return 
$k == 'b';
}, 
ARRAY_FILTER_USE_KEY));

var_dump(array_filter($arr, function($v$k) {
    return 
$k == 'b' || $v == 4;
}, 
ARRAY_FILTER_USE_BOTH));
?>

Exemplul de mai sus va afișa:

array(1) {
  ["b"]=>
  int(2)
}
array(2) {
  ["b"]=>
  int(2)
  ["d"]=>
  int(4)
}

Note

Precauţie

Dacă tabloul este modificat în funcția de apel invers (de ex. un element este adăugat, eliminat sau desetat) comportamentul acestei funcții este nedefinit.

A se vedea și

  • array_map() - Applies the callback to the elements of the given arrays
  • array_reduce() - Iteratively reduce the array to a single value using a callback function
  • array_walk() - Apply a user supplied function to every member of an array

add a note add a note

User Contributed Notes 25 notes

up
519
Anonymous
11 years ago
If you want a quick way to remove NULL, FALSE and Empty Strings (""), but leave values of 0 (zero), you can use the standard php function strlen as the callback function:
eg:
<?php

// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter( $array, 'strlen' );

?>
up
236
Peter Robinett
13 years ago
Because array_filter() preserves keys, you should consider the resulting array to be an associative array even if the original array had integer keys for there may be holes in your sequence of keys. This means that, for example, json_encode() will convert your result array into an object instead of an array. Call array_values() on the result array to guarantee json_encode() gives you an array.
up
90
niehztog
15 years ago
In case you are interested (like me) in filtering out elements with certain key-names, array_filter won't help you. Instead you can use the following:

<?php
$arr
= array( 'element1' => 1, 'element2' => 2, 'element3' => 3, 'element4' => 4 );
$filterOutKeys = array( 'element1', 'element4' );

$filteredArr = array_diff_key( $arr, array_flip( $filterOutKeys ) )
?>

Result will be something like this:
['element2'] => 2
['element3'] => 3
up
11
nicolaj dot knudsen at gmail dot com
7 years ago
If you like me have some trouble understanding example #1 due to the bitwise operator (&) used, here is an explanation.

The part in question is this callback function:

<?php
function odd($var)
{
   
// returns whether the input integer is odd
   
return($var & 1);
}
?>

If given an integer this function returns the integer 1 if $var is odd and the integer 0 if $var is even.
The single ampersand, &, is the bitwise AND operator. The way it works is that it takes the binary representation of the two arguments and compare them bit for bit using AND. If $var = 45, then since 45 in binary is 101101 the operation looks like this:

45 in binary: 101101
1 in binary:  000001
              ------
result:       000001

Only if the last bit in the binary representation of $var is changed to zero (meaning that the value is even) will the result change to 000000, which is the representation of zero.
up
37
webdesign at blackbyrd dot biz
14 years ago
Here's a function that will filter a multi-demensional array. This filter will return only those items that match the $value given

<?php
   
/*
     * filtering an array
     */
   
function filter_by_value ($array, $index, $value){
        if(
is_array($array) && count($array)>0
        {
            foreach(
array_keys($array) as $key){
               
$temp[$key] = $array[$key][$index];
                
                if (
$temp[$key] == $value){
                   
$newarray[$key] = $array[$key];
                }
            }
          }
      return
$newarray;
    }
?>

Example:

<?php
$results
= array(
  
0 => array('key1' => '1', 'key2' => 2, 'key3' => 3),
  
1 => array('key1' => '12', 'key2' => 22, 'key3' => 32)
);

$nResults = filter_by_value($results, 'key2', '2');
?>

Output :

array(
    0 => array('key1' => '1', 'key2' => 2, 'key3' => 3)
);
up
23
manwe at inversion dot pl
9 years ago
array_filter remove also FALSE and 0. To remove only NULL's use:

$af = [1, 0, 2, null, 3, 6, 7];

function is_not_null($val){
    return !is_null($val);
}
$af = array_filter($af, 'is_not_null');
up
27
marc dot vanwoerkom at fernuni-hagen dot de
19 years ago
Some of PHP's array functions play a prominent role in so called functional programming languages, where they show up under a slightly different name:

<?php
  array_filter
() -> filter(),
 
array_map() -> map(),
 
array_reduce() -> foldl() ("fold left")
?>

Functional programming is a paradigm which centers around the side-effect free evaluation of functions. A program execution is a call of a function, which in turn might be defined by many other functions. One idea is to use functions to create special purpose functions from other functions.

The array functions mentioned above allow you compose new functions on arrays.

E.g. array_sum = array_map("sum", $arr).

This leads to a style of programming that looks much like algebra, e.g. the Bird/Meertens formalism.

E.g. a mathematician might state

  map(f o g) = map(f) o map(g)

the so called "loop fusion" law.

Many functions on arrays can be created by the use of the foldr() function (which works like foldl, but eating up array elements from the right).

I can't get into detail here, I just wanted to provide a hint about where this stuff also shows up and the theory behind it.
up
19
romain dot lamarche at gmail dot com
15 years ago
This function filters an array and remove all null values recursively.

<?php
 
function array_filter_recursive($input)
  {
    foreach (
$input as &$value)
    {
      if (
is_array($value))
      {
       
$value = array_filter_recursive($value);
      }
    }
   
    return
array_filter($input);
  }
?>

Or with callback parameter (not tested) :

<?php
 
function array_filter_recursive($input, $callback = null)
  {
    foreach (
$input as &$value)
    {
      if (
is_array($value))
      {
       
$value = array_filter_recursive($value, $callback);
      }
    }
   
    return
array_filter($input, $callback);
  }
?>
up
8
marc dot gray at gmail dot com
10 years ago
My favourite use of this function is converting a string to an array, trimming each line and removing empty lines:

<?php
$array
= array_filter(array_map('trim', explode("\n", $string)), 'strlen');
?>

Although it states clearly that array keys are preserved, it's important to note this includes numerically indexed arrays. You can't use a for loop on $array above without processing it through array_values() first.
up
11
lisachenko dot it at HUMAN dot gmail dot com
12 years ago
You can access the current key of array by passing a reference to array into callback function and call key() and next() method in the callback function:
<?php
$data
= array('first' => 1, 'second' => 2, 'third' => 3);
$data = array_filter($data, function ($item) use (&$data) {
    echo
"Filtering key ", key($data), '<br>', PHP_EOL;
   
next($data);
    return
false;
});
?>

However be careful with array internal pointer or use reset() method before calling array_filter().
up
4
jtreminio at gmail dot com
11 years ago
You can use array_filter from within a class to access a protected method from that same class:

<?php

class Bar {
    public function
foo()
    {
       
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);

       
print_r(array_filter($array1, array($this, 'naz')));
    }

    protected function
baz($var)
    {
        return(
$var & 1);
    }
}

$bar = new Bar();
$bar->foo();
?>
up
3
ajohnson at speakeasy dot org
21 years ago
I was looking for a function to delete values from an array and thought I had found it in array_filter(), however, I *didn't* want the keys to be preserved *and* I needed blank values cleaned out of the array as well. I came up with the following (with help from many of the above examples):

<?php
function array_delete($array, $filterfor){
 
$thisarray = array ();
  foreach(
$array as $value)
    if(
stristr($value, $filterfor)===false && strlen($value)>0)
     
$thisarray[] = $value;
  return
$thisarray;
}

$array1 = array ('OtHeR','this', 'that', 'Other','', 9, 101, 'fifty', 'other','','');

echo
"<pre>array :\n";
print_r($array1);

$array2=array_delete($array1, "Other");

echo
"filtered:\n";
print_r($array2);
?>
up
2
Martin
16 years ago
This function trims empty strings from the beginning and end of an array.
It's useful when outputing plaintext files on a page and you want to skip empty lines at the beginning and end, but not within the text.

<?php
function array_trim($array) {
    while (
strlen(reset($array)) === 0) {
       
array_shift($array);
    }
    while (
strlen(end($array)) === 0) {
       
array_pop($array);
    }
    return
$array;
}
?>

You might want to trim each element too.
up
1
Al Amin Chayan (mail at chayan dot me)
3 years ago
/**
   * Remove key from multidimensional array
   *
   * @param array $request
   * @param array $keys
   *
   * @return array
   */
function request_filter(array $request, array $keys) {
    array_walk($request, function (&$value, $key) use ($keys) {
        if(is_array($value)) {
            $value = request_filter($value, $keys);
        }
    });

    return array_filter ($request, function ($value, $key) use ($keys) {
        return ! in_array($key, $keys);
    }, ARRAY_FILTER_USE_BOTH);
}

$data = [
  'a' => 'A',
  'password' => 123,
  'data' => [
      'b' => 'B',
      'data2' => [
           'c' => 'C',
            'password' => 545,
    ],
    'password' => 321,
  ]
];

print_r(request_filter($data, ['password']));

Output will be:
Array
(
    [a] => A
    [data] => Array
        (
            [b] => B
            [data2] => Array
                (
                    [c] => C
                )

        )

)
up
2
njt1982 at yahoo dot com
9 years ago
If you have an array of KV pairs and you want all the items where a value is X, you dont need to make a callback for array_filter. You can use array_intersect:

<?php
print_r
(array_intersect(
  array(
   
'a' => 1,
   
'b' => 1,
   
'c' => 1,
   
'd' => 2,
   
'e' => 2,
   
'f' => 2,
  ),
  array(
1)
));

Array
(
    [
a] => 1
   
[b] => 1
   
[c] => 1
)
?>

The advantage of this approach is you can pass variables into the second array without needing to worry about variable scope and function parameters for array_filter.
up
2
iancudanielc () gmail ! com
9 years ago
If you want to pass the key to the callback function before PHP 5.6.0 (when the flag parameter wasn't implemented):

<?php

$result
= array_filter(array_keys($array), 'is_int');

?>
up
3
avl
10 years ago
nice trick:

$array_out = array_filter($array_in, function($var) use($array_other) {
            return in_array($var, $array_other) ? true : false;
});
up
1
stef at gigamedium dot com
3 years ago
To filter out empty arrays, put the arrays you need filtering in an array and pass through array_filter.

$array1 = [5, 6];
$array2 = [];
$array3 = [7,9];

$array = array_filter(array($array1, $array2, $array3));

print_r($array)

Results in:
Array (
  [5,6] , [7,9]
}
up
0
JF Sanfacon
2 years ago
Flag ARRAY_FILTER_USE_KEY and ARRAY_FILTER_USE_BOTH are only available since PHP 5.6
up
0
g dot kuizinas at anuary dot com
11 years ago
<?php
function array_filter_recursive ($data) {
   
$original = $data;

   
$data = array_filter($data);
   
   
$data = array_map(function ($e) {
        return
is_array($e) ? array_filter_recursive($e) : $e;
    },
$data);

    return
$original === $data ? $data : array_filter_recursive($data);
}

$data = ['a' => 0, 'b' => [], 'c' => [[]], 'd' => [[[[]]]], 'e' => 'foo', 'f' => [[['a']]], [true], [[],['a'], [true, false]]];

$data = array_filter_recursive($data);
?>
up
0
darren at dazwin dot com
15 years ago
Regarding comment about trimming empty strings, the code posted will get into an infinite loop if the array is reduced to zero elements. The following might be better:

<?php
function array_trim($array) {
    while (!empty(
$array) and strlen(reset($array)) === 0) {
       
array_shift($array);
    }
    while (!empty(
$array) and strlen(end($array)) === 0) {
       
array_pop($array);
    }
    return
$array;
}
?>
up
0
ajohnson at speakeasy dot org
21 years ago
be careful with the above function "array_delete"'s use of the stristr function, it could be slightly misleading. consider the following:

<?php
function array_delete($array, $filterforsubstring){
   
$thisarray = array ();
    foreach(
$array as $value)
        if(
stristr($value, $filterforsubstring)===false && strlen($value)>0)
           
$thisarray[] = $value;
    return
$thisarray;
}

function
array_delete2($array, $filterforstring, $removeblanksflag=0){
   
$thisarray = array ();
    foreach(
$array as $value)
        if(!(
stristr($value, $filterforstring) && strlen($value)==strlen($filterforstring))
                && !(
strlen($value)==0 && $removeblanksflag))
           
$thisarray[] = $value;
    return
$thisarray;
}

function
array_delete3($array, $filterfor, $substringflag=0, $removeblanksflag=0){
   
$thisarray = array ();
    foreach(
$array as $value)
        if(
            !(
stristr($value, $filterfor)
                && (
$substringflag || strlen($value)==strlen($filterfor))
            )
            && !(
strlen($value)==0 && $removeblanksflag)
        )
           
$thisarray[] = $value;
    return
$thisarray;
}

$array1 = array ('the OtHeR thang','this', 'that', 'OtHer','', 9, 101, 'fifty', ' oTher', 'otHer ','','other','Other','','other blank things');

echo
"<pre>array :\n";
print_r($array1);

$array2=array_delete($array1, "Other");

echo
"array_delete(\$array1, \"Other\"):\n";
print_r($array2);

$array2=array_delete2($array1, "Other");

echo
"array_delete2(\$array1, \"Other\"):\n";
print_r($array2);

$array2=array_delete2($array1, "Other",1);

echo
"array_delete2(\$array1, \"Other\",1):\n";
print_r($array2);

$array2=array_delete3($array1, "Other",1);

echo
"array_delete3(\$array1, \"Other\",1):\n";
print_r($array2);

$array2=array_delete3($array1, "Other",0,1);

echo
"array_delete3(\$array1, \"Other\",0,1):\n";
print_r($array2);
?>
up
-2
John Erck: erck0006 at junkyo dot gmail dot com
12 years ago
<?php
// ARRAY FILTER RECURSIVE USING CLASS, STATIC METHOD, AND ANONYMOUS CALLBACK FUNCTION
// NOTE THAT THE CALLBACK HAS ACCESS TO BOTH THE KEY AND VALUE

// THE CLASS (FOR YOU TO COPY)
class ArrayUtil
{
    public static function
FilterRecursive(Array $source, $fn)
    {
       
$result = array();
        foreach (
$source as $key => $value)
        {
            if (
is_array($value))
            {
               
$result[$key] = self::FilterRecursive($value, $fn);
                continue;
            }
            if (
$fn($key, $value))
            {
               
$result[$key] = $value; // KEEP
               
continue;
            }
        }
        return
$result;
    }
}

// EXAMPLE ANONYMOUS CALLBACK FUNCTION
$fn = function ($key, $value)
{
    if (
strpos($key, 'drop') !== FALSE)
    {
        return
FALSE; // DROP
   
}
    return
TRUE; // KEEP
};

// EXAMPLE PRE FILTER TEST DATA
$preFilter = array(
   
'a' => 'one',
   
'b' => array(
       
'example_drop' => 'filter me out',
       
'example_keep' => 'keep me',
    ),
   
'c' => 'three',
);

// EXAMPLE USAGE CODE
echo '// print_r($preFilter);' . "\n";
print_r($preFilter);
$postFilter = ArrayUtil::FilterRecursive($preFilter, $fn);
echo
"\n";
echo
'// print_r($postFilter);' . "\n";
print_r($postFilter);

/* OUTPUT OPEN
// print_r($preFilter);
Array
(
    [a] => one
    [b] => Array
        (
            [example_drop] => filter me out
            [example_keep] => keep me
        )

    [c] => three
)

// print_r($postFilter);
Array
(
    [a] => one
    [b] => Array
        (
            [example_keep] => keep me
        )

    [c] => three
)
OUTPUT CLOSE */
up
-2
chrisstocktonaz at gmail dot com
15 years ago
I use the following to see if a array consist of scalar values or null, but of course you could mix it up using any of the is_ functions.

<?php
if(count($data) !== count(array_filter($data, 'is_scalar') + array_filter($data, 'is_null'))) {
  throw new
Exception('Array did not consist of scalar and null values');
}
?>
up
-3
Maxwel Leite
19 years ago
For any type of array. Basead in redshift code.

<?php
function array_clean ($array, $todelete = false, $caseSensitive = false) {
    foreach(
$array as $key => $value) {
        if(
is_array($value)) {
           
$array[$key] = array_clean($array[$key], $todelete, $caseSensitive);
        }
        else {
            if(
$todelete) {
                if(
$caseSensitive) {
                    if(
strstr($value ,$todelete) !== false)
                        unset(
$array[$key]);
                }
                else {
                    if(
stristr($value, $todelete) !== false)
                        unset(
$array[$key]);
                }
            }
            elseif (empty(
$value)) {
                unset(
$array[$key]);
            }
        }
    }
    return
$array;
}
?>
To Top