Як видалити елемент масиву, а потім переіндексувати масив?


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
Це краще, ніж рішення обману, якщо кілька елементів потрібно видалити відразу - якщо індекси цих елементів будуть зібрані заздалегідь. Щойно ви використовуєте array_splice на першому елементі, ви втрачаєте індекси решти елементів.
Яніс Елмеріс

23
Можливо, варто відзначити, що ви можете скинути декілька змінних / індексів масиву в одному виклику, який не встановлюєтьсяunset($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 ОП ніколи не просила підтримувати початковий порядок. Я просто запропонував рішення, яке працює і робить те, що зазначено.
frostymarvelous

1
Питання - 2 роки. Відпусти!
s3v3n

@ s3v3n Це не прикро. Я просто хочу знати, чому. Очевидно, що поліпшити в наступних відповідях. Я згоден, що є кращі методи, але чи є причина, що ця відповідь така погана? Це продуктивність? тощо? З тієї ж причини я і на SO, щоб навчитися так само, як і вчити.
frostymarvelous

За звичайних обставин, дуже ймовірно, що програмісту знадобляться ці значення в точно такому ж порядку, як і вхідні дані. Візьмемо для прикладу кілька рядків із бази даних, які повинні відображатися в таблиці; або додаток для чату, де відповіді мають бути в точно такому ж порядку. Кількість прикладів може бути нескінченною, справа в тому, що в більшості випадків порядок повинен бути однаковим або, принаймні, програміст очікував би однакового порядку елементів у масиві.
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.