Ответ 1
Вы можете использовать array_values
после фильтрации, чтобы получить значения.
если я отфильтрую массив с помощью array_filter, чтобы исключить нулевые значения, ключи будут сохранены, и это создаст "дыры" в массиве. Например:
The filtered version of
[0] => 'foo'
[1] => null
[2] => 'bar'
is
[0] => 'foo'
[2] => 'bar'
Как я могу получить вместо
[0] => 'foo'
[1] => 'bar'
?
Вы можете использовать array_values
после фильтрации, чтобы получить значения.
Используя этот вход:
$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()
.