Bir PHP dizisinin değerlerini temizlemenin en iyi yolu


172

Hangisi bir dizideki tüm değerleri temizlemek için daha etkilidir? Birincisi, bu örneği her seferinde ikinci örneğin döngüsünde kullanmamı gerektirir.

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

Veya bu

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

5
Sorun nedir unset($array)?
Blake

13
değişkeni siler.
el_pup_le

2
Evet, ama neden bu şekilde ayarladığınız bir boş diziyi değerlendirmek istersiniz?
Blake

3
Kaynak? Bellekteki hiçbir değişken var değerinin null değerinden daha küçük görünmüyor.
Blake

Yanıtlar:


257

Zack'in aşağıdaki yorumlarda söylediği gibi, basitçe kullanarak yeniden başlatabilirsiniz.

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

Daha güçlü bir şey istiyorsanız unset kullanın çünkü $ foo sembol tablosundan temizler, daha sonra diziye ihtiyacınız varsa tekrar başlatın.

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

63
Neden sadece yeniden somutlaştırmıyoruz $foo = array();?
Zack Zatkin-Gold

2
@NishamMahsin Ya kullanın global $foo; unset($foo);ya daunset($GLOBALS['foo']);
Eric Herlitz

7
@vivoconunxino Yazarlar "PHP dizisinin değerlerini temizlemek için en iyi yol" sorusu nedeniyle bu şekilde yazdım. 'Yeni örnek' değil 'açık'. Kullanılması sembol tablosundan unsetsilinir $foo. Ben muhtemelen $foo = null; unset($foo);biraz daha iyi bellek temizlemek istiyorum çünkü ben muhtemelen tavsiye ederim çok büyük tablolar hakkında konuşuyoruz . Ancak bu davranış (GC) çok sabit değildir ve PHP sürümlerinde değişebilir.
Eric Herlitz

5
unset () bazen çok kötüdür ve yanlış kullanırsanız soruna neden olabilir. OP cevabını doğru cevaplamıyor. Bunu neden en iyi cevap olarak kabul ettiğini bilmiyorum, kendi sorusundaki yorumu, unset ile ilgili sorunun değişkenin silinmesi olduğunu söylüyor. Bu çözümlerin neden olduğu sorunları görmek için, cevabımı burada bulabilirsiniz .
Wolfsblvt

2
Herkese destek olmak gerekirse $foo = array();: aslında içinde kavramsal bir sorun olabilir: bir yapıyı yeniden başlatmak onu boşaltmakla aynı şey değildir. Hafızayla uğraşırken, ayırmanın yavaş olmasıyla aynı şey olmadığını biliyorsunuz. Bu nedenle, kullanım kolaylığına rağmen, özellikle çok fazla ve hızlı bir şekilde yapılması gerekiyorsa, yeniden başlatma bu sorunun cevabı olmayabilir. Çalışabilir, ancak bu büyük ölçüde PHP bellek yönetimi IMO'ya dayanır.
TechNyquist

82

Bir değişkeni boş bir diziye sıfırlamak istiyorsanız, basitçe yeniden başlatabilirsiniz:

$foo = array();

Bunun herhangi bir referansı koruyacağını unutmayın:

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

Herhangi bir referansı kırmak istiyorsanız, önce ayarını kaldırı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
Bence bu en iyi cevap. Kabul edilmelidir. En basit yolu gösterir ve ayrıca neden ve ne zaman unsetkullanılması gerektiğini açıklar . +1

Bu benim kodum: justpaste.it/1gt46 . Değişken içinde birden fazla kimlik nasıl bildirebilirim? Tek değer beyanı: $ productId = 19; $ ProductId = 'de birden fazla değeri nasıl bildirebilirim?
Gem

@Rathinam Bir diziyi temizlerken bunun ne yapacağından emin değilim. Lütfen Stackoverflow'a yeni bir soru gönderin ve kodunuzu doğrudan soruya yapıştırın.
mpen

32

Ne yazık ki diğer soruları cevaplayamıyorum, yeterli itibara sahip değilim, ama benim için ÇOK önemli bir şey olduğunu belirtmem gerekiyor ve bence diğer insanlara da yardımcı olacak.

Orijinal dizinin referansına ihtiyaç duymadıkça değişkenin ayarını kaldırmak iyi bir yoldur !

Ne demek istediğimi netleştirmek için: Dizinin referansını kullanan bir fonksiyonunuz varsa, örneğin bir sıralama fonksiyonu

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

çalışmıyor! Burada dikkatli olun unset, referansı siler, böylece değişken $arrayyeniden oluşturulur ve doğru şekilde doldurulur, ancak değerlere işlevin dışından erişilemez.

Bu nedenle referanslarınız varsa, daha az temiz ve anlaşılır olsa bile $array = array()yerine kullanmanız gerekir unset.


3
bu cevap olmalıdır - OP dizilerin tümünün referansını kaldırmayacak şekilde açık diziler değerleri söylüyor.
Ross

13

Diziyi ilişkisel ise ilk söyleyebilirim. Değilse, bir fordöngü kullanın :

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

Mümkünse,

$array = array();

Diziyi boş bir diziye sıfırlamak tercih edilir.





2

dizi temizlemek için unset () kullandık ama unset () dizi boş hale getirecek farkına varmış, bu nedenle örneğin gibi diziyi yeniden beyan etmek gerekir

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

Bu sorular gerçek eski görüyorum, ama bu sorun için bir dizideki tüm değerleri ayarlamak için özyinelemeli bir işlev yazdım. Özyinelemeli, çünkü verilen dizideki değerlerin de bir dizi olması mümkündür. Bu benim için işe yarıyor:

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;

}

Böylece tüm anahtarları ve alt dizileri, ancak boş değerleri ile dizi olsun.


1

Belki basit, ekonomik bir yol (kullanmak için daha az işaret) ...

$array = [];

Php manuel okuyabilir:

PHP 5.4'ten itibaren array () öğesini [] ile değiştiren kısa dizi sözdizimini de kullanabilirsiniz.


Ayrıca açıklamalısınız.
Kulshreshth K

0

ayarlanmazsa çöp toplayıcı bir öğle yemeği ara vermeden, onun tur yapıyor zaman işlev yararlıdır;

ancak unset fonksiyonu basitçe veriler için değişken referansı yok eder, veriler hala bellekte bulunur ve PHP artık bir işaretçi olmamasına rağmen kullanımda olduğu gibi görür.

Çözüm:null Verileri temizlemek için değişkenlerinize, en azından çöp toplayıcı veriyi toplayana kadar atayın .

$var = null;

ve sonra benzer şekilde ayarını kaldırın!

unset($var);

4
Kulağa doğru gelmiyor. Bunu nullbir çöp toplama anında zorlayacak sanmıyorum . Bunun için bir referansınız var mı?
mpen

@mpen Atamanın bu örnekte değişkenin NULLkonumunda depolanan değerin yerini alacağını kabul ediyor musunuz $var?
Anthony Rutledge

1
@AnthonyRutledge Hayır, bilmiyorum. Bildiğim kadarıyla PHP, $varbazı küresel NULLnesnelere işaret edecek şekilde güncellenecek ve $varçöp toplanana kadar verilerini yalnız bırakacak . Tercüman neden bu verilerin üzerine hemen yazmaya zorlanıyor?
mpen

@mpen Bu iyi bir soru, ama o dünyada en azından her şey toplanmaya hazır.
Anthony Rutledge

Aslında.
Asıl

-1

Bu güçlü ve test edilmiş unset ($ gradearray); // diziyi yeniden ayarla


1
Soruyu cevaplamak için hangisinin en iyi yol olduğunu ve nedenini açıklamalısınız
Fabian Horlacher
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.