PHP | Удалить элемент из массива с переупорядочением? - PullRequest
9 голосов
/ 31 января 2010

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

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

Ответ / Решение: массив массив_значений ( массив $ input).

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

Ответы [ 6 ]

14 голосов
/ 31 января 2010
array_values($c)

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

4 голосов
/ 31 января 2010

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

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

2 голосов
/ 21 февраля 2013

Другой вариант будет 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);
1 голос
/ 31 января 2010

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

0 голосов
/ 18 декабря 2017

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

0 голосов
/ 31 января 2010

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

...