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

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

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

Ответы [ 4 ]

184 голосов
/ 04 августа 2010

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

24 голосов
/ 25 декабря 2014

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

$NewArray = array_values(array_filter($OldArray));
11 голосов
/ 27 апреля 2017

Я беспокоюсь о том, сколько программистов невинно скопировали / вставили метод 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 () & 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',
)

Наконец, для любого, кто предпочитает синтаксис языковых конструкций, вы также можете просто вставить квалифицирующие значения в новый массив для выпуска новых индексов.

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

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
10 голосов
/ 04 августа 2010

Использование 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
...