2010-01-31 45 views
7

Làm cách nào để xóa phần tử của mảng và sắp xếp lại sau đó mà không có phần tử trống trong mảng?PHP | Xóa phần tử khỏi mảng với sắp xếp lại?

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

trả lời/Giải pháp: mảng array_values ​​(mảng $ đầu vào).

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

Trả lời

11
array_values($c) 

sẽ trả về một mảng mới chỉ với các giá trị, lập chỉ mục theo đường thẳng.

4

Nếu bạn luôn loại bỏ phần tử đầu tiên, sau đó sử dụng array_shift() thay vì unset().

Nếu không, bạn sẽ có thể sử dụng thứ gì đó như $ a = array_values ​​($ a).

1

Nếu bạn chỉ loại bỏ các mục đầu tiên của mảng, bạn có thể sử dụng array_shift($c);

-1

Hoặc reset(); cũng là một lựa chọn tốt

+0

'reset(); 'không phải là, theo PHP.net: "reset() tua lại mảng' s con trỏ nội bộ đến phần tử đầu tiên và trả về giá trị của phần tử mảng đầu tiên. " – Harmen

+0

Ok Cảm ơn, thực sự cho downvote của bạn – streetparade

2

Một lựa chọn khác sẽ là array_splice(). Điều này sắp xếp lại các phím số và dường như là một phương thức nhanh hơn nếu bạn đang thu thập đủ dữ liệu để quan tâm. Nhưng tôi thích unset() array_values ​​() để dễ đọc.

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

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

thử nghiệm Tốc độ:

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 

Mã kiểm tra:

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); 
0

array_shift()thay đổi giá trị đầu tiên của mảng tắt và trả về nó, rút ​​ngắn mảng bằng một phần tử và di chuyển mọi thứ xuống. Tất cả các phím mảng số sẽ được sửa đổi để bắt đầu đếm từ số không trong khi các phím chữ sẽ không được chạm vào.

array_shift ($ stack);

dụ:

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

Output:

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

Nguồn: http://php.net/manual/en/function.array-shift.php

+0

Wow, bạn đang lớn về sao chép và dán. Vui lòng đọc http://stackoverflow.com/help/how-to-answer –

+0

Cảm ơn vì điều đó! –

Các vấn đề liên quan