После array_filter(), как я могу сбросить ключи, чтобы они шли в числовом порядке, начиная с 0?
Вопрос
Я только что использовал array_filter для удаления записей, которые имели только значение '' из массива, и теперь я хочу применить к нему определенные преобразования в зависимости от заполнителя, начиная с 0, но, к сожалению, он все еще сохраняет исходный индекс.Я смотрел некоторое время и ничего не увидел, возможно, я просто упустил очевидное, но мой вопрос...
Как я могу легко сбросить индексы массива, чтобы они начинались с 0 и двигались по порядку в НОВОМ массиве, вместо того, чтобы сохранять старые индексы?
Решение
Если вы звоните array_values
На вашем массиве он будет оно оправдан от нуля.
Другие советы
Если вы используете фильтр массива, сделайте это следующим образом
$NewArray = array_values(array_filter($OldArray));
Использовать array_values()
:
<?php
$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
return $var !== 'bar';
});
print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
Меня беспокоит, сколько программистов невинно скопировали/вставили array_values(array_filter())
метод в свои коды -- Интересно, сколько программистов невольно столкнулись с проблемами из-за жадности array_filter.Или, что еще хуже, сколько людей так и не обнаружили, что функция удаляет слишком много значений из массива...
Я представлю лучшую альтернативу двухэтапному процессу зачистки. NULL
элементы из массива и переиндексация ключей.
Однако, во-первых, чрезвычайно важно подчеркнуть жадную природу array_filter()
и как это может незаметно испортить ваш проект.Вот массив со смешанными значениями, который выявит проблему:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Нулевые значения будут удалены независимо от верхнего или нижнего регистра.
Но посмотрите, что остается в массиве, когда мы используем array_values() & array_filter():
array_values(array_filter($array));
Выходной массив ($array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Теперь посмотрите, что вы получите с помощью моего метода, использующего array_walk() & нулевой() для создания нового отфильтрованного массива:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Это можно записать в несколько строк для облегчения чтения/объяснения:
array_walk( // iterate each element of an input array
$array, // this is the input array
function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
if(!is_null($v)){ // this literally checks for null values
$filtered[]=$v; // value is pushed into output with new indexes
}
}
);
Выходной массив ($filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
С помощью моего метода вы получаете переиндексированные ключи, все ненулевые значения и ни одно из нулевых значений.Чистый, портативный и надежный однострочник для всех ваших потребностей в фильтрации нулей в массиве.Вот демонстрация.
Аналогично, если вы хотите удалить пустые, ложные и нулевые элементы (сохраняющие нули), эти четыре метода будут работать:
var_export(array_values(array_diff($array,[''])));
или
var_export(array_values(array_diff($array,[null])));
или
var_export(array_values(array_diff($array,[false])));
или
var_export(array_values(array_filter($array,'strlen')));
Выход:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Наконец, для тех, кто предпочитает синтаксис языковых конструкций, вы также можете просто поместить уточняющие значения в новый массив для создания новых индексов.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);