Как я могу удалить элемент массива и впоследствии изменить порядок, не имея пустого элемента в массиве?
<?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 )
Или reset();
также является хорошим выбором