Join the Stack Overflow Community
Stack Overflow is a community of 6.5 million programmers, just like you, helping each other.
Join them; it only takes a minute:
Sign up

How can I remove an element of an array, and reorder afterwards, without having an empty element in the array?

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

Answer / Solution: array array_values ( array $input ).

<?php
   $c = array( 0=>12,1=>32 );
   unset($c[0]);
   print_r(array_values($c));
   // will print: the array cleared
?>
share|improve this question
up vote 11 down vote accepted
array_values($c)

will return a new array with just the values, indexed linearly.

share|improve this answer

If you are always removing the first element, then use array_shift() instead of unset().

Otherwise, you should be able to use something like $a = array_values($a).

share|improve this answer

Another option would be array_splice(). This reorders numeric keys and appears to be a faster method if you are crunching enough data to care. But I like unset() array_values() for readability.

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

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

Speed test:

    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

Test Code:

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);
share|improve this answer

If you only remove the first item of the array, you could use array_shift($c);

share|improve this answer

Or reset(); is also a good choice

share|improve this answer
    
reset(); is not, according to PHP.net: "reset() rewinds array 's internal pointer to the first element and returns the value of the first array element." – Harmen Jan 31 '10 at 19:18
    
Ok Thanks, indeed for your downvote – streetparade Jan 31 '10 at 19:26

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.