PHP |通过重新排序从数组中删除元素?

时间:2010-01-31 19:14:04

标签: php arrays pointers return unset

如何删除数组中的元素,然后在数组中没有空元素的情况下重新排序?

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

答案/解决方案:数组 array_values(数组 $ input)。

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

7 个答案:

答案 0 :(得分:14)

array_values($c)

将返回一个只包含值的新数组,线性索引。

答案 1 :(得分:4)

如果你总是删除第一个元素,那么使用array_shift()而不是unset()。

否则,您应该可以使用类似$ a = array_values($ a)的内容。

答案 2 :(得分:2)

另一个选项是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);

答案 3 :(得分:1)

如果您只删除数组的第一项,则可以使用array_shift($c);

答案 4 :(得分:0)

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

答案 5 :(得分:0)

$array=["one"=>1,"two"=>2,"three"=>3];
$newArray=array_shift($array);

return array_values($newArray);

返回[2,3] array_shift从数组中删除第一个元素 array_values仅返回值

答案 6 :(得分:-1)

reset();也是一个不错的选择