Làm thế nào để loại bỏ phần tử mảng và sau đó chỉ mục lại mảng?


206

Tôi có một số rắc rối với một mảng. Tôi có một mảng mà tôi muốn sửa đổi như dưới đây. Tôi muốn loại bỏ phần tử (phần tử) của nó bằng chỉ mục và sau đó lập chỉ mục lại mảng. Có thể không?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Câu trả lời:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
Đây chính xác là những gì tôi muốn đăng, +1.
Michiel Pater

4
Điều này tốt hơn so với giải pháp của sự lừa dối nếu một số mục cần phải được xóa cùng một lúc - nếu chỉ mục của các mục đó được thu thập trước. Khi bạn sử dụng mảng_splice trên mục đầu tiên, bạn sẽ mất các chỉ mục của các mục còn lại.
Jāni Elmeris

23
Có thể đáng lưu ý rằng bạn có thể hủy đặt nhiều biến / chỉ mục mảng trong một cuộc gọi bỏ đặt đơnunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛ ᴍᴀᴛᴛ

giải pháp rất hay bro :)
Michael Kisilenko

Tôi đã sử dụng này. Cảm ơn bạn. Tôi đã sử dụng array_splicevà nó không hoạt động cho các chỉ số 0 và 1.
theGreenCabbage


29

Bạn sử dụng tốt hơn array_shift(). Điều đó sẽ trả về phần tử đầu tiên của mảng, loại bỏ nó khỏi mảng và lập chỉ mục lại mảng. Tất cả trong một phương pháp hiệu quả.


2
Điều này tốt khi bạn muốn truy xuất và sau đó loại bỏ phần tử mảng đầu tiên, giới thiệu lại mảng trong quy trình. Hàm đối tác của nó array_pop()sẽ lấy và loại bỏ phần tử mảng cuối cùng nếu bạn cần. Nhưng, không có chức năng nào có thể được thực hiện để hành động trên một phần tử ở giữa mảng.
Derrick Miller

1
Trong khi điều này có liên quan trực giao, câu hỏi rõ ràng về bất kỳ yếu tố nào của một mảng, không chỉ đầu tiên.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Tôi không biết lý do tại sao điều này bị hạ cấp, nhưng nếu bất cứ ai đã cố gắng thử nó, bạn sẽ nhận thấy rằng nó hoạt động. Sử dụng sort trên một mảng sẽ gán lại các khóa của mảng. Hạn chế duy nhất là nó sắp xếp các giá trị. Vì các khóa rõ ràng sẽ được gán lại, ngay cả với array_values, điều quan trọng là các giá trị có được sắp xếp hay không.


9
ngay cả khi các khóa sẽ được gán lại, trong câu trả lời đúng, thứ tự ban đầu sẽ được giữ lại.
s3v3n

1
"Tôi muốn loại bỏ phần tử (phần tử) của nó bằng chỉ mục và sau đó lập lại mảng chỉ mục. Có thể không?" @ s3v3n OP không bao giờ yêu cầu duy trì đơn hàng ban đầu. Tôi chỉ đơn giản là cung cấp một giải pháp hoạt động và làm những gì được nêu.
sương giá

1
Câu hỏi là 2 tuổi. Để nó đi!
s3v3n

@ s3v3n Đó không phải là mối hận thù. Tôi chỉ muốn biết tại sao. Rõ ràng để cải thiện trong câu trả lời sau. Tôi đồng ý rằng có những phương pháp tốt hơn, nhưng có lý do gì câu trả lời này quá tệ không? Có phải là hiệu suất? Vân vân? Cùng một lý do tôi vào SO, để học cũng như dạy.
frostymarvelous

Trong các trường hợp thông thường, rất có khả năng lập trình viên sẽ cần các giá trị đó theo đúng thứ tự như đầu vào. Hãy lấy một ví dụ về một số hàng từ cơ sở dữ liệu sẽ được hiển thị trong bảng; hoặc một ứng dụng trò chuyện trong đó các câu trả lời phải theo thứ tự chính xác. Số lượng ví dụ có thể là vô hạn, điểm quan trọng là trong hầu hết các trường hợp, thứ tự cần phải giống nhau hoặc ít nhất là lập trình viên sẽ mong đợi thứ tự giống nhau của các phần tử trong mảng.
s3v3n

4

Hãy thử với:

$foo2 = array_slice($foo, 1);

Điều này chỉ hoạt động cho các yếu tố đầu tiên và không phải là một yếu tố tùy ý.
Felix Kling

0

Ngoài câu trả lời của xzyfer

Chức năng

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Sử dụng

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Kết quả

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

0

Nếu bạn sử dụng array_merge, điều này sẽ reindex các phím. Các hướng dẫn sử dụng:

Các giá trị trong mảng đầu vào với các phím số sẽ được đánh số lại với các khóa tăng dần bắt đầu từ 0 trong mảng kết quả.

http://php.net/manual/en/feft.array-merge.php

Đây là nơi tôi tìm thấy câu trả lời ban đầu.

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset ()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.