original_string: public static function filter(array $data, $callback = ['self', '_filter'])
      {
          foreach ($data as $k => $v) {
              if (is_array($v)) {
                  $data[$k] = static::filter($v, $callback);
              }
          }
  
          return array_filter($data, $callback);
      }
code: public static function filter(array $data, $callback = ['self', '_filter'])
      {
          foreach ($data as $k => $v) {
              if (is_array($v)) {
                  $data[$k] = static::filter($v, $callback);
              }
          }
  
          return array_filter($data, $callback);
      }
code_tokens: public static function filter ( array $ data , $ callback = [ 'self' , '_filter' ] ) { foreach ( $ data as $ k => $ v ) { if ( is_array ( $ v ) ) { $ data [ $ k ] = static :: filter ( $ v , $ callback ) ; } } return array_filter ( $ data , $ callback ) ; }
docstring: Recursively filters a data set.
  
  @param array $data Either an array to filter, or value when in callback
  @param callable|array $callback A function to filter the data with. Defaults to
  `static::_filter()` Which strips out all non-zero empty values.
  @return array Filtered array
  @link https://book.cakephp.org/3.0/en/core-libraries/hash.html#Cake\Utility\Hash::filter
docstring_tokens: Recursively filters a data set .