วิธีที่ดีที่สุดในการล้างค่าอาร์เรย์ของ PHP


172

ซึ่งมีประสิทธิภาพมากขึ้นสำหรับการล้างค่าทั้งหมดในอาร์เรย์? คนแรกจะให้ฉันใช้ฟังก์ชั่นนั้นทุกครั้งในลูปของตัวอย่างที่สอง

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

หรือสิ่งนี้

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

5
มีอะไรผิดปกติกับunset($array)?
เบลค

13
ลบตัวแปร
el_pup_le

2
ใช่ แต่ทำไมคุณต้องการประเมินอาร์เรย์ว่างที่คุณตั้งไว้อย่างนั้น?
เบลค

3
แหล่งที่มา? ไม่มีตัวแปรในหน่วยความจำที่ดูเหมือนว่ามันจะเล็กกว่า var เป็นโมฆะ
เบลค

คำตอบ:


256

เช่นเดียวกับแซคที่กล่าวไว้ในความคิดเห็นด้านล่างคุณสามารถสร้างอินสแตนซ์ใหม่ได้โดยใช้

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

หากคุณต้องการบางสิ่งบางอย่างที่มีประสิทธิภาพมากขึ้นการใช้งาน unset เพราะมันจะล้าง $ foo จากตารางสัญลักษณ์หากคุณต้องการอาเรย์ในภายหลังเพียงแค่ยกตัวอย่างอีกครั้ง

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

63
ทำไมไม่ลองสร้างมันใหม่ดู$foo = array();ล่ะ?
Zack Zatkin-Gold

2
@NishamMahsin ไม่ว่าจะใช้global $foo; unset($foo);หรือunset($GLOBALS['foo']);
Eric Herlitz

7
@ vivoconunxino ฉันเขียนแบบนั้นเพราะผู้เขียนถามว่า "วิธีที่ดีที่สุดในการล้างค่าอาร์เรย์ของ PHP" มันเป็น 'ชัดเจน' ไม่ใช่ 'อินสแตนซ์ใหม่' การใช้unsetจะล้าง$fooออกจากตารางสัญลักษณ์ ฉันเรากำลังพูดถึงตารางที่มีขนาดใหญ่มากฉันอาจจะแนะนำ$foo = null; unset($foo);ตั้งแต่นั้นยังจะล้างหน่วยความจำดีขึ้นเล็กน้อย พฤติกรรมนั้น (GC) นั้นไม่คงที่และอาจเปลี่ยนแปลงได้ในเวอร์ชัน PHP
Eric Herlitz

5
unset () บางครั้งก็แย่มากและอาจทำให้เกิดปัญหาได้หากคุณใช้ผิด ไม่ตอบคำตอบ OPs อย่างถูกต้อง ไม่ทราบว่าเพราะเหตุใดเขาจึงยอมรับสิ่งนี้เป็นคำตอบที่ดีที่สุดความคิดเห็นของเขาเกี่ยวกับคำถามของเขาเองบอกว่าปัญหาที่เกิดขึ้นกับการไม่ได้ตั้งค่าคือการลบตัวแปร หากต้องการดูปัญหาชแก้ปัญหานี้สาเหตุให้ดูที่คำตอบของฉันที่นี่
Wolfsblvt

2
สำหรับการสนับสนุนทั้งหมด$foo = array();: จริง ๆ แล้วอาจมีปัญหาด้านแนวคิดในตัวมัน: การสร้างอินสแตนซ์ใหม่ของโครงสร้างไม่เหมือนกับการล้างมัน เมื่อจัดการกับหน่วยความจำคุณรู้ว่ามันไม่เหมือนกับการจัดสรรช้า ดังนั้นแม้จะใช้งานง่าย แต่การสร้างอินสแตนซ์ใหม่อาจไม่ใช่คำตอบสำหรับคำถามนี้โดยเฉพาะหากจำเป็นต้องทำหลายครั้งและอย่างรวดเร็ว อาจใช้งานได้ แต่นั่นจะขึ้นอยู่กับการจัดการหน่วยความจำ PHP, IMO
TechNyquist

82

หากคุณต้องการรีเซ็ตตัวแปรเป็นอาเรย์ที่ว่างเปล่าคุณสามารถกำหนดค่าเริ่มต้นใหม่ได้:

$foo = array();

โปรดทราบว่าสิ่งนี้จะรักษาการอ้างอิงใด ๆ ไว้:

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

หากคุณต้องการทำลายการอ้างอิงใด ๆ ให้ยกเลิกการตั้งค่าก่อน:

$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
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด ควรได้รับการยอมรับ มันแสดงวิธีที่ง่ายที่สุดและยังอธิบายถึงสาเหตุและเวลาที่unsetควรใช้ +1

นี่คือรหัสของฉัน: justpaste.it/1gt46 ฉันจะประกาศมากกว่าหนึ่ง id ในตัวแปรได้อย่างไร การประกาศค่าเดียวคือ: $ productId = 19; ฉันจะประกาศมากกว่าหนึ่งค่าใน $ productId = ได้อย่างไร
อัญมณี

@Rathinam ไม่แน่ใจว่าเกี่ยวข้องกับการล้างอาเรย์อย่างไร โปรดโพสต์คำถามใหม่ใน Stackoverflow และวางรหัสของคุณลงในคำถามโดยตรง
mpen

32

น่าเศร้าที่ฉันไม่สามารถตอบคำถามอื่นไม่ได้มีชื่อเสียงมากพอ แต่ฉันต้องชี้ให้เห็นบางสิ่งที่สำคัญมากสำหรับฉันและฉันคิดว่ามันจะช่วยคนอื่นด้วย

การยกเลิกการตั้งค่าตัวแปรเป็นวิธีที่ดียกเว้นว่าคุณต้องการการอ้างอิงของอาร์เรย์ดั้งเดิม!

เพื่อให้ชัดเจนสิ่งที่ฉันหมายถึง: ถ้าคุณมีฟังก์ชั่นที่ใช้การอ้างอิงของอาร์เรย์เช่นฟังก์ชั่นการเรียงลำดับเช่น

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;
    }
}

มันไม่ทำงาน! ระวังที่นี่unsetลบการอ้างอิงดังนั้นตัวแปร$arrayจะถูกสร้างขึ้นใหม่และเติมอย่างถูกต้อง แต่ค่านั้นไม่สามารถเข้าถึงได้จากนอกฟังก์ชั่น

ดังนั้นหากคุณมีการอ้างอิงคุณต้องใช้$array = array()แทนunsetแม้ว่าจะมีความสะอาดและเข้าใจน้อย


3
นี่ควรเป็นคำตอบ - OP บอกว่าค่าอาร์เรย์ที่ชัดเจนไม่ใช่การอ้างอิงตัวแปรอาเรย์ทั้งหมด
Ross

13

ฉันจะพูดก่อนถ้าอาร์เรย์มีการเชื่อมโยง ถ้าไม่ใช้forห่วง:

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

แม้ว่าจะเป็นไปได้ถ้าใช้

$array = array();

หากต้องการรีเซ็ตอาร์เรย์เป็นอาร์เรย์ว่างจะดีกว่า





2

ฉันได้ใช้ unset () เพื่อล้างอาเรย์ แต่ฉันได้ตระหนักว่า unset () จะทำให้อาเรย์เป็นโมฆะดังนั้นจึงจำเป็นต้องประกาศอาเรย์อีกครั้งเช่น

<?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

ฉันเห็นคำถามนี้เป็นคำถามเก่า แต่สำหรับปัญหานั้นฉันได้เขียนฟังก์ชันเรียกซ้ำเพื่อยกเลิกการตั้งค่าทั้งหมดในอาร์เรย์ เกิดซ้ำเนื่องจากความเป็นไปได้ที่ค่าจากอาร์เรย์ที่กำหนดจะเป็นอาร์เรย์ด้วย เพื่อให้เหมาะกับฉัน:

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;

}

ดังนั้นด้วยการที่ฉันได้รับอาร์เรย์ที่มีคีย์และอาร์เรย์ย่อยทั้งหมด แต่ค่าที่ว่างเปล่า


1

อาจเป็นวิธีที่เรียบง่ายและประหยัด (ใช้สัญญาณน้อยกว่า) ...

$array = [];

เราสามารถอ่านคู่มือ php ได้:

ในฐานะของ PHP 5.4 คุณยังสามารถใช้ไวยากรณ์อาร์เรย์แบบสั้นซึ่งแทนที่ array () ด้วย []


คุณควรอธิบายด้วย
Kulshreshth K

0

การตั้งค่าฟังก์ชั่นจะเป็นประโยชน์เมื่อเก็บขยะที่มีการทำรอบในขณะที่ไม่ได้มีเวลาพักกลางวัน;

อย่างไรก็ตามฟังก์ชั่น unset เพียงทำลายการอ้างอิงตัวแปรกับข้อมูลข้อมูลยังคงมีอยู่ในหน่วยความจำและ PHP เห็นหน่วยความจำที่ใช้งานอยู่แม้จะไม่มีตัวชี้อีกต่อไป

การแก้ไข: กำหนดnullตัวแปรของคุณเพื่อล้างข้อมูลอย่างน้อยก็จนกว่าตัวเก็บขยะจะได้รับการเก็บไว้

$var = null;

แล้วยกเลิกการตั้งค่าในลักษณะเดียวกัน!

unset($var);

4
นั่นไม่ได้เสียงที่ถูกต้อง ฉันไม่คิดว่าการตั้งค่าnullจะบังคับให้มีการรวบรวมขยะทันที คุณมีการอ้างอิงสำหรับสิ่งนั้นหรือไม่?
mpen

@mpen คุณเห็นด้วยหรือไม่ว่าการมอบหมายNULLจะแทนที่ค่าที่เก็บไว้ที่ตำแหน่งของ$varตัวแปรในตัวอย่างนี้หรือไม่?
Anthony Rutledge

1
@AththonyRutledge ไม่ฉันทำไม่ได้ สำหรับสิ่งที่ฉันรู้ PHP จะอัปเดต$varให้ชี้ไปที่NULLวัตถุระดับโลกและปล่อยให้$varข้อมูลอยู่คนเดียวจนกว่าจะมีการเก็บขยะ ทำไมล่ามจึงถูกบังคับให้เขียนทับข้อมูลนั้นทันที
mpen

@mpen นั่นเป็นคำถามที่ดี แต่อย่างน้อยทุกอย่างในโลกก็พร้อมที่จะรวบรวม
Anthony Rutledge

จริง ประเด็นก็คือฉันสงสัยว่าการตั้งค่าเป็นโมฆะก่อนที่จะ
ยกเลิก

-1

นี่คืออันทรงพลังและทดสอบ unset ($ gradearray); // ตั้งค่าอาร์เรย์อีกครั้ง


1
เพื่อตอบคำถามคุณควรอธิบายว่าวิธีใดดีที่สุดและทำไม
Fabian Horlacher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.