Ответ 1
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
У меня есть проблемы с массивом. У меня есть один массив, который я хочу изменить, как показано ниже. Я хочу удалить элемент (элементы) из него по индексу, а затем повторно проиндексировать массив. Возможно ли это?
$foo = array(
'whatever', // [0]
'foo', // [1]
'bar' // [2]
);
$foo2 = array(
'foo', // [0], before [1]
'bar' // [1], before [2]
);
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
array_splice($array, 0, 1);
Лучше использовать array_shift()
. Это вернет первый элемент массива, удалит его из массива и переиндексирует массив. Все в одном эффективном методе.
array_splice($array, array_search(array_value,$array),1);
Попробуйте:
$foo2 = array_slice($foo, 1);
Unset($array[0]);
Sort($array);
Я не знаю, почему это задерживается, но если кто-то потрудился попробовать его, вы заметите, что он работает.
Использование сортировки по массиву переназначает ключи массива. Единственный недостаток - это сортировка значений.
Поскольку ключи, очевидно, будут переназначены, даже при array_values
, не имеет значения, сортируются значения или нет.
Если вы используете array_merge
, это приведет к повторному индексу ключей. В руководстве указано:
Значения во входном массиве с числовыми ключами будут перенумерованы на приращение клавиш, начинающихся с нуля в массиве результатов.
http://php.net/manual/en/function.array-merge.php
Вот где я нашел исходный ответ.
http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset()
В дополнение к 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"
}