После array_filter (), как я могу сбросить ключи, чтобы перейти в числовом порядке, начиная с 0

Я просто использовал array_filter для удаления записей, которые имели только значение '' из массива, и теперь я хочу применить к нему определенные преобразования в зависимости от заполнителя, начиная с 0, но, к сожалению, он по-прежнему сохраняет исходный индекс. Я искал какое-то время и ничего не видел, возможно, я просто пропустил очевидное, но мой вопрос …

Как я могу легко сбросить индексы массива, чтобы начать с нуля и идти в порядке в массиве NEW, вместо того, чтобы сохранить старые индексы?

Solutions Collecting From Web of "После array_filter (), как я могу сбросить ключи, чтобы перейти в числовом порядке, начиная с 0"

Если вы вызываете array_values в вашем массиве, он будет переиндексироваться с нуля.

Если вы используете фильтр Array, сделайте это следующим образом

 $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 ( 0 => 'foo', 1 => 'bar' ) // All empty, zero-ish, falsey values were removed too!!! 

Теперь посмотрим, что вы получаете с моим методом, который использует array_walk () и is_null () для создания нового фильтрованного массива:

 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', )