Я просто использовал array_filter для удаления записей, которые имели только значение '' из массива, и теперь я хочу применить к нему определенные преобразования в зависимости от заполнителя, начиная с 0, но, к сожалению, он по-прежнему сохраняет исходный индекс. Некоторое время я искал и ничего не увидел, возможно, я просто упустил очевидное, но мой вопрос ...
Как я могу легко сбросить индексы массива, чтобы они начинались с 0 и переходили по порядку в НОВЫЙ массив, вместо того, чтобы сохранять старые индексы?
array_filter()
- вы можете очистить больше, чем намереваетесь. Вот некоторые объяснения с демонстрацией: stackoverflow.com/a/43657056/2943403Ответы:
Если вы
array_values
вызовете свой массив, он будет переиндексирован с нуля.источник
Если вы используете фильтр Array, сделайте это следующим образом
источник
Меня беспокоит, сколько программистов невинно скопировали / вставили
array_values(array_filter())
метод в свои коды - мне интересно, сколько программистов невольно столкнулись с проблемами из-за жадности array_filter. Или, что еще хуже, сколько людей никогда не обнаруживали, что функция удаляет слишком много значений из массива ...Я представлю лучшую альтернативу двухэтапному процессу удаления
NULL
элементов из массива и повторной индексации ключей.Однако, во-первых, чрезвычайно важно подчеркнуть жадность
array_filter()
и то, как это может незаметно разрушить ваш проект. Вот массив со смешанными значениями, который выявит проблему:Нулевые значения будут удалены независимо от верхнего / нижнего регистра.
Но посмотрите, что остается в массиве, когда мы используем array_values () и array_filter () :
Выходной массив ($ array):
Теперь посмотрите, что вы получаете с моим методом, который использует array_walk () и is_null () для создания нового фильтрованного массива:
Это можно записать в несколько строк для облегчения чтения / объяснения:
Выходной массив ($ filter):
С помощью моего метода вы получаете повторно проиндексированные ключи, все ненулевые значения и ни одно из нулевых значений. Чистый, портативный и надежный однострочник для всех ваших потребностей в фильтрации нулевого массива. Вот демонстрация .
Точно так же, если вы хотите удалить пустые, ложные и нулевые элементы (с сохранением нулей), эти четыре метода будут работать:
или
или
или
Вывод:
Наконец, для тех, кто предпочитает синтаксис языковых конструкций, вы также можете просто вставить соответствующие значения в новый массив для создания новых индексов.
источник
array_values(array_filter($arr, function($el) {return $el !== '';}))
? Это кажется естественным способом сделать то, о чем спрашивает ОП.array_filter()
если только их глубокое знание данных не допускает жадную фильтрацию без побочных эффектов. (Еще одно предостережение:empty()
ведет себя таким же образом, а также включает в себя пустой массив в своей жадности.)array_filter()
ведет себя точно так же, как и следовало ожидать, исходя из того, что написано в руководстве: php.net/manual/en/function.array-filter.php «Если обратный вызов не предоставлен, все записи массива равны FALSE (см. преобразование в логическое ) будет удален ". И программисты PHP должны быть хорошо осведомлены, что 0, null, false, '' и '0' все оценивают как false при принуждении к логическому.Использование
array_values()
:источник