php - Find elements with empty value in multidimensional array

Solution:

If your input is always of a fixed depth, you can map the existing values to the keys of all empty items:

$output = array_map(function($row) {
    return array_keys(array_filter($row, function ($e) {
        return empty($e) && $e !== 0;
    }));
}, $arrays);

The outer function runs for each "row", the value of which is then converted into a list of all keys with empty values (excluding zeroes, as in the question).

This will keep the outer keys B & C as empty arrays, so if you want them to be removed as well then run another iteration of array_filter over the result:

$output = array_filter($output)

See https://3v4l.org/c23ZB

As mentioned in the comments, there are still several loops going on here, they're just not as visible in the code. A regular foreach loop might end up being a lot easier to read, and possibly perform faster as well.

Answer

Solution:

You can use next combination of array_walk & array_filter:

    $result = [];

    array_walk(
        $arrays,
        function($el, $key) use(&$result) {
            $empty = array_filter($el, function($el){return $el == "";});
            $empty_keys = array_keys($empty);
            if (count($empty_keys)) $result[$key] = $empty_keys;
        }
    );

Try it here

Answer

Solution:

This is another way to achieve your desired output.

$result = [];
 foreach($arrays as $key => $value) {
     $empty_arr = array_filter($value, function ($ele) {
         return empty($ele);
     });
      $empty_arr_keys = array_keys($empty_arr);
      if(!empty($empty_arr_keys)) $result[$key] = $empty_arr_keys;        
  }
        
 print_r($result);

Answer

Solution:

@iainn's answer can be sharpened up by calling !strlen() on the deep values.

Code: (Demo)

var_export(
    array_filter(
        array_map(
            fn($row) => array_keys(
                array_filter(
                    $row,
                    fn($v) => !strlen($v)
                )
            ),
            $array
        )
    )
);

But you will end up making fewer iterations and writing cleaner, more intuitive/readable code if you use classic loops. This is how I would write it in my own project:

Code: (Demo)

$result = [];
foreach ($array as $rowKey => $row) {
    foreach ($row as $key => $value) {
        if (!strlen($value)) {
            $result[$rowKey][] = $key;
        }
    }
}
var_export($result);

Source