Как удалить элемент массива, а затем повторно индексировать массив?


206

У меня есть некоторые проблемы с массивом. У меня есть один массив, который я хочу изменить, как показано ниже. Я хочу удалить элемент (элементы) по индексу, а затем переиндексировать массив. Является ли это возможным?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Ответы:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
Это именно то, что я хотел опубликовать, +1.
Михил Патер

4
Это лучше, чем решение deceze, если необходимо удалить несколько элементов одновременно - если индексы этих элементов собираются заранее. Как только вы используете array_splice для первого элемента, вы теряете индексы остальных элементов.
Янис Элмерис

23
Возможно, стоит отметить, что вы можете сбросить несколько переменных / индексов массива за один вызов unsetunset($foo[0], $foo[3], $bar[1]);
ʙᴀᴋᴇʀ ʙᴀᴋᴇʀ

очень хорошее решение, братан :)
Михаил Кисиленко

Я использовал это. Спасибо. Я использовал array_splice, и он не работал для 0-го и 1-го индексов.
theGreenCabbage


29

Тебе лучше использовать array_shift(). Это вернет первый элемент массива, удалит его из массива и переиндексирует массив. Все в одном эффективном методе.


2
Это нормально, когда вы хотите получить, а затем удалить первый элемент массива, переиндексируя массив в процессе. Его функция-аналог array_pop()будет извлекать и удалять последний элемент массива, если вам это нужно. Но ни одна из этих функций не может воздействовать на элемент в середине массива.
Деррик Миллер

1
Хотя это ортогонально связано, вопрос явно о любом элементе массива, а не только о первом.
Феликс Ганьон-Гренье


9
Unset($array[0]); 

Sort($array); 

Я не знаю, почему за это проголосовали, но если кто-то попытался попробовать, вы заметите, что это работает. Использование сортировки в массиве переназначает ключи массива. Единственный недостаток - это сортировка значений. Поскольку ключи, очевидно, будут переназначены, даже при array_valuesэтом, не имеет значения, сортируются значения или нет.


9
даже если ключи будут переназначены, при правильном ответе первоначальный порядок будет сохранен.
s3v3n

1
«Я хочу удалить его элемент (элементы) по индексу, а затем переиндексировать массив. Возможно ли это?» @ s3v3n ОП никогда не просил поддерживать первоначальный порядок. Я просто предоставил решение, которое работает и делает то, что заявлено.
морозный

1
Вопросу 2 года. Отпусти ситуацию!
s3v3n

@ s3v3n Это не обида. Я просто хочу знать почему. Очевидно, чтобы улучшить в последующих ответах. Я согласен, что есть лучшие методы, но есть ли причина, почему этот ответ так плох? Это производительность? и т.д? По той же причине я нахожусь на ТАК, чтобы учиться так же как преподавать.
морозный

При нормальных обстоятельствах очень вероятно, что программисту понадобятся эти значения в том же порядке, что и для ввода. Давайте возьмем в качестве примера несколько строк из базы данных, которые должны отображаться в таблице; или приложение чата, где ответы должны быть в том же порядке. Количество примеров может быть бесконечным, суть в том, что в большинстве случаев порядок должен быть одинаковым или, по крайней мере, программист будет ожидать такой же порядок элементов в массиве.
s3v3n


0

В дополнение к ответу xzyfer

Функция

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

использование

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

результат

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

0

Если вы используете array_merge, это будет переиндексировать ключи. В руководстве говорится:

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

http://php.net/manual/en/function.array-merge.php

Вот где я нашел оригинальный ответ.

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset ()

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.