Cách tốt nhất để xóa các giá trị của mảng PHP


172

Cái nào hiệu quả hơn để xóa tất cả các giá trị trong một mảng? Cái đầu tiên sẽ yêu cầu tôi sử dụng hàm đó mỗi lần trong vòng lặp của ví dụ thứ hai.

foreach ($array as $i => $value) {
    unset($array[$i]);
}

Hoặc cái này

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

5
Có chuyện gì với bạn unset($array)vậy?
Blake

13
xóa biến.
el_pup_le

2
Vâng, nhưng tại sao bạn muốn đánh giá một mảng null mà bạn đặt theo cách đó?
Blake

3
Nguồn? Không có biến nào trong bộ nhớ có vẻ như nó sẽ nhỏ hơn var là null.
Blake

Câu trả lời:


256

Giống như Zack đã nói trong các bình luận bên dưới, bạn có thể chỉ cần khởi tạo lại nó bằng cách sử dụng

$foo = array(); // $foo is still here

Nếu bạn muốn một cái gì đó mạnh mẽ hơn, hãy sử dụng unset vì nó cũng sẽ xóa $ foo khỏi bảng ký hiệu, nếu bạn cần mảng sau, chỉ cần khởi tạo lại nó.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

63
Tại sao không chỉ khởi tạo lại nó như là $foo = array();?
Zack Zatkin-Gold

2
@NishamMahsin Hoặc sử dụng global $foo; unset($foo);hoặcunset($GLOBALS['foo']);
Eric Herlitz

7
@vivoconunxino Tôi đã viết nó theo cách đó vì các tác giả đặt câu hỏi "Cách tốt nhất để xóa các giá trị của mảng PHP". Nó là "rõ ràng", không phải "trường hợp mới". Sử dụng unsetsẽ xóa $fookhỏi bảng biểu tượng. Tôi đang nói về những cái bàn rất lớn có lẽ tôi muốn giới thiệu $foo = null; unset($foo);vì điều đó cũng sẽ xóa bộ nhớ tốt hơn một chút. Tuy nhiên, hành vi đó (GC) không phải là rất thường xuyên và có thể thay đổi so với các phiên bản PHP.
Eric Herlitz

5
unset () đôi khi rất tệ và có thể gây rắc rối, nếu bạn sử dụng sai. Nó không trả lời đúng câu trả lời của OP. Không biết tại sao anh ấy chấp nhận đây là câu trả lời hay nhất, nhận xét của anh ấy về câu hỏi của chính anh ấy nói rằng vấn đề với unset là nó xóa biến. Để xem các vấn đề mà giải pháp này gây ra, hãy xem câu trả lời của tôi ở đây .
Wolfsblvt

2
Đối với tất cả các hỗ trợ $foo = array();: thực sự có thể có một vấn đề khái niệm trong đó: khởi tạo lại một cấu trúc không giống như làm trống nó. Khi xử lý bộ nhớ, bạn biết đó không giống như phân bổ chậm. Vì vậy, mặc dù dễ sử dụng, việc khởi tạo lại có thể không phải là câu trả lời cho câu hỏi này, đặc biệt nếu một người cần thực hiện nó rất nhiều lần và nhanh chóng. Nó có thể hoạt động, nhưng điều đó phụ thuộc nhiều vào quản lý bộ nhớ PHP, IMO.
TechNyquist

82

Nếu bạn chỉ muốn đặt lại một biến thành một mảng trống, bạn có thể chỉ cần xác định lại nó:

$foo = array();

Lưu ý rằng điều này sẽ duy trì bất kỳ tài liệu tham khảo nào về nó:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

Nếu bạn muốn ngắt bất kỳ tham chiếu nào đến nó, trước tiên hãy bỏ đặt nó:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged

3
Tôi nghĩ rằng đây là câu trả lời tốt nhất. Nên được chấp nhận. Nó chỉ ra cách đơn giản nhất và cũng mô tả tại sao và khi nào unsetnên sử dụng. +1

Đây là mã của tôi: justpaste.it/1gt46 . Làm thế nào tôi có thể khai báo nhiều hơn một id trong biến. Khai báo giá trị đơn là: $ productId = 19; Làm cách nào tôi có thể khai báo nhiều hơn một giá trị trong $ productId =?
Đá quý

@Rathinam Không chắc chắn những gì phải làm với việc xóa một mảng. Vui lòng gửi câu hỏi mới trên Stackoverflow và dán mã của bạn trực tiếp vào câu hỏi.
mở

32

Đáng buồn thay, tôi không thể trả lời các câu hỏi khác, không có đủ danh tiếng, nhưng tôi cần chỉ ra một điều gì đó RẤT quan trọng đối với tôi và tôi nghĩ nó cũng sẽ giúp người khác.

Bỏ đặt biến là một cách hay, trừ khi bạn cần tham chiếu của mảng ban đầu!

Để làm rõ ý tôi muốn nói: Nếu bạn có một hàm, hãy sử dụng tham chiếu của mảng, ví dụ như một hàm sắp xếp như

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

nó không làm việc! Hãy cẩn thận ở đây, unsetxóa tham chiếu, để biến $arrayđược tạo lại và điền chính xác, nhưng các giá trị không thể truy cập từ bên ngoài hàm.

Vì vậy, nếu bạn có tài liệu tham khảo, bạn cần sử dụng $array = array()thay vì unset, ngay cả khi nó không sạch sẽ và dễ hiểu.


3
đây phải là câu trả lời - OP cho biết các giá trị mảng rõ ràng, không tham chiếu toàn bộ biến mảng.
Ross

13

Tôi sẽ nói đầu tiên, nếu mảng là kết hợp. Nếu không, sử dụng một forvòng lặp:

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

Mặc dù nếu có thể, sử dụng

$array = array();

Để thiết lập lại mảng thành một mảng trống là tốt hơn.





2

tôi đã sử dụng unset () để xóa mảng nhưng tôi nhận ra rằng unset () sẽ hiển thị mảng null do đó cần phải khai báo lại mảng như ví dụ

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>

1

Tôi thấy câu hỏi này là cũ, nhưng đối với vấn đề đó tôi đã viết một hàm đệ quy để bỏ đặt tất cả các giá trị trong một mảng. Đệ quy vì có thể các giá trị từ mảng đã cho cũng là một mảng. Vì vậy, nó làm việc cho tôi:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

Vì vậy, với điều đó tôi nhận được mảng với tất cả các khóa và mảng phụ, nhưng các giá trị trống.


1

Có lẽ cách đơn giản, kinh tế (ít dấu hiệu sử dụng) ...

$array = [];

Chúng ta có thể đọc trong hướng dẫn sử dụng php:

Kể từ phiên bản PHP 5.4, bạn cũng có thể sử dụng cú pháp mảng ngắn, thay thế mảng () bằng [].


Bạn cũng nên giải thích nó.
Kulshreshth K

0

Các unset chức năng rất hữu ích khi thu gom rác đang làm vòng của nó trong khi không có một giờ nghỉ trưa;

tuy nhiên hàm unset chỉ đơn giản phá hủy tham chiếu biến đối với dữ liệu, dữ liệu vẫn tồn tại trong bộ nhớ và PHP thấy bộ nhớ như đang sử dụng mặc dù không còn có con trỏ tới dữ liệu đó.

Giải pháp: Chỉ định nullcho các biến của bạn để xóa dữ liệu, ít nhất là cho đến khi trình thu gom rác được giữ lại.

$var = null;

và sau đó bỏ đặt nó theo cách tương tự!

unset($var);

4
Điều đó không đúng. Tôi không nghĩ rằng thiết lập nó nullsẽ buộc một bộ sưu tập rác ngay lập tức. Bạn có một tài liệu tham khảo cho điều đó?
mpen

@mpen Bạn có đồng ý rằng việc gán NULLsẽ thay thế giá trị được lưu trữ tại vị trí của $varbiến trong ví dụ này không?
Anthony Rutledge

1
@AnthonyRutledge Không, tôi không. Đối với tất cả những gì tôi biết, PHP sẽ chỉ cập nhật $varđể trỏ đến một số NULLđối tượng toàn cầu và để lại $vardữ liệu cho đến khi rác được thu thập. Tại sao trình thông dịch sẽ bị buộc phải ghi đè dữ liệu đó ngay lập tức?
mpen

@mpen Đó là một câu hỏi hay, nhưng trong thế giới đó ít nhất mọi thứ đã sẵn sàng để được thu thập.
Anthony Rutledge

Thật. Vấn đề là tôi nghi ngờ việc đặt nó thành null trước khi bỏ đặt nó sẽ giúp bất kỳ
mpen

-1

Đây là unset mạnh mẽ và được thử nghiệm ($ gradearray); // đặt lại mảng


1
Để trả lời câu hỏi, bạn nên giải thích cách nào là tốt nhất và tại sao
Fabian Horlacher
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.