PHP | Удалить элемент из массива с переупорядочением?

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

<?php $c = array( 0=>12,1=>32 ); unset($c[0]); // will distort the array. ?> 

Ответ / Решение: array array_values ​​( массив $ input).

 <?php $c = array( 0=>12,1=>32 ); unset($c[0]); print_r(array_values($c)); // will print: the array cleared ?> с <?php $c = array( 0=>12,1=>32 ); unset($c[0]); print_r(array_values($c)); // will print: the array cleared ?> 

 array_values($c) 

будет возвращать новый массив с только значениями, индексированными линейно.

Если вы всегда удаляете первый элемент, используйте функцию array_shift () вместо unset ().

В противном случае вы должны использовать что-то вроде $ a = array_values ​​($ a).

Другим вариантом будет array_splice (). Это переупорядочивает числовые клавиши и, по-видимому, является более быстрым, если вы хрустите достаточное количество данных для ухода. Но мне нравится unset () array_values ​​() для удобочитаемости.

 array_splice( $array, $index, $num_elements_to_remove); 

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

Тест скорости:

  ArraySplice process used 7468 ms for its computations ArraySplice spent 918 ms in system calls UnsetReorder process used 9963 ms for its computations UnsetReorder spent 31 ms in system calls 

Тестовый код:

 function rutime($ru, $rus, $index) { return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); } function time_output($title, $rustart, $ru) { echo $title . " process used " . rutime($ru, $rustart, "utime") . " ms for its computations\n"; echo $title . " spent " . rutime($ru, $rustart, "stime") . " ms in system calls\n"; } $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ array_splice($test,90000,1); } $ru = getrusage(); time_output('ArraySplice', $rustart, $ru); unset($test); $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ unset($test[90000]); $test = array_values($test); } $ru = getrusage(); time_output('UnsetReorder', $rustart, $ru); с function rutime($ru, $rus, $index) { return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); } function time_output($title, $rustart, $ru) { echo $title . " process used " . rutime($ru, $rustart, "utime") . " ms for its computations\n"; echo $title . " spent " . rutime($ru, $rustart, "stime") . " ms in system calls\n"; } $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ array_splice($test,90000,1); } $ru = getrusage(); time_output('ArraySplice', $rustart, $ru); unset($test); $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ unset($test[90000]); $test = array_values($test); } $ru = getrusage(); time_output('UnsetReorder', $rustart, $ru); с function rutime($ru, $rus, $index) { return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); } function time_output($title, $rustart, $ru) { echo $title . " process used " . rutime($ru, $rustart, "utime") . " ms for its computations\n"; echo $title . " spent " . rutime($ru, $rustart, "stime") . " ms in system calls\n"; } $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ array_splice($test,90000,1); } $ru = getrusage(); time_output('ArraySplice', $rustart, $ru); unset($test); $test = array(); for($i = 0; $i<100000; $i++){ $test[$i] = $i; } $rustart = getrusage(); for ($i = 0; $i<1000; $i++){ unset($test[90000]); $test = array_values($test); } $ru = getrusage(); time_output('UnsetReorder', $rustart, $ru); 

Если вы удалите только первый элемент массива, вы можете использовать array_shift($c);

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

array_shift ($ стеки);

пример:

 $stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_shift($stack); print_r($stack); 

Вывод:

 Array ( [0] => banana [1] => apple [2] => raspberry ) 

Источник: http://php.net/manual/en/function.array-shift.php

Или reset(); также является хорошим выбором