Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursively remove empty elements and subarrays from a multi-dimensional array

Tags:

I can't seem to find a simple, straight-forward solution to the age-old problem of removing empty elements from arrays in PHP.

My input array may look like this:

Array ( [0] => Array ( [Name] => [EmailAddress] => ) ) 

(And so on, if there's more data, although there may not be...)

If it looks like the above, I want it to be completely empty after I've processed it.

So print_r($array); would output:

Array ( )

If I run $arrayX = array_filter($arrayX); I still get the same print_r output. Everywhere I've looked suggests this is the simplest way of removing empty array elements in PHP5, however.

I also tried $arrayX = array_filter($arrayX,'empty_array'); but I got the following error:

Warning: array_filter() [function.array-filter]: The second argument, 'empty_array', should be a valid callback

What am I doing wrong?

like image 890
Chuck Le Butt Avatar asked Mar 27 '12 18:03

Chuck Le Butt


People also ask

How to remove empty values from multidimensional array in PHP?

The empty elements can be removed from array using array_filter() function in PHP. But array_filter() function will not remove empty sub-arrays from a multi-dimensional array. If you want to remove empty array elements recursively, an additional function needs to be used with array_filter() function in PHP.

How to remove multidimensional array in PHP?

Using unset() Function: The unset() function is used to remove element from the array. The unset function is used to destroy any other variable and same way use to delete any element of an array. This unset command takes the array key as input and removed that element from the array.

What is Multidimentional array?

Multidimensional arrays are an extension of 2-D matrices and use additional subscripts for indexing. A 3-D array, for example, uses three subscripts. The first two are just like a matrix, but the third dimension represents pages or sheets of elements.


4 Answers

Try using array_map() to apply the filter to every array in $array:

$array = array_map('array_filter', $array);
$array = array_filter($array);

Demo: http://codepad.org/xfXEeApj

like image 80
Wesley Murch Avatar answered Sep 25 '22 16:09

Wesley Murch


There are numerous examples of how to do this. You can try the docs, for one (see the first comment).

function array_filter_recursive($array, $callback = null) {
    foreach ($array as $key => & $value) {
        if (is_array($value)) {
            $value = array_filter_recursive($value, $callback);
        }
        else {
            if ( ! is_null($callback)) {
                if ( ! $callback($value)) {
                    unset($array[$key]);
                }
            }
            else {
                if ( ! (bool) $value) {
                    unset($array[$key]);
                }
            }
        }
    }
    unset($value);

    return $array;
}

Granted this example doesn't actually use array_filter but you get the point.

like image 37
jeremyharris Avatar answered Sep 25 '22 16:09

jeremyharris


The accepted answer does not do exactly what the OP asked. If you want to recursively remove ALL values that evaluate to false including empty arrays then use the following function:

function array_trim($input) {
    return is_array($input) ? array_filter($input, 
        function (& $value) { return $value = array_trim($value); }
    ) : $input;
}

Or you could change the return condition according to your needs, for example:

{ return !is_array($value) or $value = array_trim($value); }

If you only want to remove empty arrays. Or you can change the condition to only test for "" or false or null, etc...

like image 37
Alain Avatar answered Sep 21 '22 16:09

Alain


Following up jeremyharris' suggestion, this is how I needed to change it to make it work:

function array_filter_recursive($array) {
   foreach ($array as $key => &$value) {
      if (empty($value)) {
         unset($array[$key]);
      }
      else {
         if (is_array($value)) {
            $value = array_filter_recursive($value);
            if (empty($value)) {
               unset($array[$key]);
            }
         }
      }
   }

   return $array;
}
like image 44
CodedMonkey Avatar answered Sep 22 '22 16:09

CodedMonkey