Подтвердить что ты не робот

Php array_filter без сохранения ключа

если я отфильтрую массив с помощью array_filter, чтобы исключить нулевые значения, ключи будут сохранены, и это создаст "дыры" в массиве. Например:

The filtered version of
    [0] => 'foo'
    [1] =>  null
    [2] => 'bar'
is 
    [0] => 'foo'
    [2] => 'bar'

Как я могу получить вместо

[0] => 'foo'
[1] => 'bar'

?

4b9b3361

Ответ 1

Вы можете использовать array_values после фильтрации, чтобы получить значения.

Ответ 2

Используя этот вход:

$array=['foo',NULL,'bar',0,false,null,'0',''];

Есть несколько способов сделать это. Demo

Слегка не по теме поднимать жадное поведение по умолчанию array_filter, но если вы ищете эту страницу, вероятно, это важная информация, относящаяся к вашему проекту/задаче:

var_export(array_values(array_filter($array)));  // NOT GOOD!!!!!

Неверный вывод:

array (
  0 => 'foo',
  1 => 'bar',
)

Теперь о том, как это будет работать:

Метод № 1: (array_values(), array_filter() с /!is_null())

var_export(array_values(array_filter($array,function($v){return !is_null($v);})));  // good

Метод № 2: (foreach(), автоматически индексируемый массив, !==null)

foreach($array as $v){
    if($v!==null){$result[]=$v;}
}
var_export($result);  // good

Метод № 3: (array_walk(), массив автоиндексирования, !is_null())

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
var_export($filtered);  // good

Все три метода обеспечивают следующий "нулевой" вывод:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Начиная с PHP7.4, вы можете даже выполнить "перепаковку" следующим образом: (для оператора splat требуются цифровые клавиши)

Код: (Демонстрация)

$array = ['foo', NULL, 'bar', 0, false, null, '0', ''];

$array = [...array_filter($array)];

var_export($array);

Выход:

array (
  0 => 'foo',
  1 => 'bar',
)

... но, как выясняется, "перепаковка" с помощью оператора splat гораздо менее эффективна, чем вызов array_values().