7

I am using Laravel 5.3.

I have a multidimensional array like:

Array
(
    [id] => 37141
    [last_done_on] => []
    [children] => Array
        (
            [0] => NULL /* This must be removed */
            [1] => Array
                (
                    [id] => 37142
                    [last_done_on] => Array()
                    [children] => Array()
                )

            [2] => Array
                (
                    [id] => 37143
                    [last_done_on] => Array()
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 37144
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                            [1] => Array
                                (
                                    [id] => 37145
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                        )
                )
            [3] => Array
                (
                    [id] => 37157
                    [last_done_on] => Array()
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 37158
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                            [1] => Array
                                (
                                    [id] => 37159
                                    [last_done_on] => Array()
                                    [children] => Array
                                        (
                                            [0] => NULL  /* This must be removed */
                                        )
                                )
                        )
                )
        )
)

And I want to remove the elements that are NULL. So the result should be like:

Array
(
    [id] => 37141
    [last_done_on] => []
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 37142
                    [last_done_on] => Array()
                    [children] => Array()
                )

            [1] => Array
                (
                    [id] => 37143
                    [last_done_on] => Array()
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 37144
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                            [1] => Array
                                (
                                    [id] => 37145
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                        )
                )
            [2] => Array
                (
                    [id] => 37157
                    [last_done_on] => Array()
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 37158
                                    [last_done_on] => Array()
                                    [children] => Array()
                                )
                            [1] => Array
                                (
                                    [id] => 37159
                                    [last_done_on] => Array()
                                    [children] => Array
                                        (
                                        )
                                )
                        )
                )
        )
)

How to do this?

1
  • This is the thing that annoys me about frameworks, it causes people to overlook the functionality that the underlying programming language provides. You don't need any fancy "web artisan" nonsense, just PHP's array_filter() function and a working knowledge of recursion. Commented Mar 16, 2017 at 10:06

4 Answers 4

11

In collection, use filter

some_collection->filter(function($value, $key) {
    return  $value != null;
});
Sign up to request clarification or add additional context in comments.

1 Comment

Good idea, but it does not answering the question about multidimensional array. For flat array it is fine.
7

If you want to remove the null values but not the empty arrays you could do something like:

function array_remove_null($item)
{
    if (!is_array($item)) {
        return $item;
    }

   return collect($item)
        ->reject(function ($item) {
            return is_null($item);
        })
        ->flatMap(function ($item, $key) {

            return is_numeric($key)
                ? [array_remove_null($item)]
                : [$key => array_remove_null($item)];
        })
        ->toArray();
}

$newArray = array_remove_null($array);

Hope this helps!

2 Comments

Seems working!! but I also want to reorder the keys. For example by removing element that is having NULL value from 0th position, the next element should become 0th.
@Dev I've updated my answer to include a way to reset numeric keys.
4

There are 2 options to use:

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

or

$yourArr = array_filter( $yourArr);

all keys with a null value will be eliminated

2 Comments

@Dev Just this line should do $yourArr= array_filter( $yourArr); See example #2 here secure.php.net/manual/en/function.array-filter.php In your case the array you want to clear up is having the key 'children', so the exact line would be $arr = array_filter($arr['children']);
@GSBajaj might be you're not getting my question.
3

Try this:

   function array_filter_recursive($input) 
   { 
      foreach ($input as &$value) 
      { 
           if (is_array($value)) 
           { 
               $value = array_filter_recursive($value); 
           } 
      }     
      return array_filter($input, function($var){return !is_null($var);} ); 
   } 

2 Comments

It removes all the elements that are empty. I don't want to remove the keys children or last_done_on even if they are empty. Also it disturbs the keys of the array.
Edited to remove only null values

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.