Bir foreach döngüsü unsetting dizi değerler

7 Cevap php

Belirli bir bağlantı için onay benim diziye geçmesi için kurulmuş bir foreach döngü var ve bu bulursa o diziden bu bağlantıyı kaldırır.

Benim kod:

foreach($images as $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif' ||
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$image]);
    }
}

Ama bu dizi entires kaldırmaz. Bu dizi girişi, sadece içerik önemli değil gibi, muhtemelen $images[$image] ile yapmak için bir şey? Bir sayacı içeren olmadan bunu yapmak için bir yolu var mı?

Teşekkürler.

EDIT: Teşekkürler çocuklar, ama şimdi dizi girişleri aslında silinmiş alamadım başka bir sorun var.

Benim yeni kodu:

foreach($images[1] as $key => $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif')
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$key]);
    }
}

$ Görüntüler artık iki boyutlu bir dizi actuallty dolayısıyla ben $ görüntüleri neden ihtiyaç [1]. Ben kontrol ve başarıyla dizi elemanlarının etrafında gider ve bazı unsurlar aslında ben silmek istediklerini bu URL'lerin bazı var, ama onlar silinir alıyorsanız değil. Bu benim $images dizidir:

Array
(
    [0] => Array
        (
            [0] => useless
            [1] => useless
            [2] => useless
            [3] => useless
            [4] => useless
        )

    [1] => Array
        (
            [0] => http://i27.tinypic.com/29yk345.gif
            [1] => http://img3.abload.de/img/10nx2340fhco.gif
            [2] => http://img3.abload.de/img/10nx2340fhco.gif
            [3] => http://i42.tinypic.com/9pp2456x.gif
        )

)

Teşekkürler!

7 Cevap

Bunu deneyin:

foreach ($images as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[$key])
    }
}

Normalde, foreach yüzden yaptığınız herhangi bir değişiklik, o kopya yapılır ve gerçek dizi etkilemez senin dizinin bir kopyası üzerinde çalışır.

Yani $ görüntüleri [$ key] aracılığıyla değerlerini yoketmek gerekir;

& $ Görüntüde referans bellek israf olur dizisinin bir kopyasını oluşturmasını döngü engeller.

$image öğenin değer ve anahtar durumunda olan. Çok anahtarı almak için aşağıdaki sözdizimini kullanın:

foreach ($images as $key => $value) {
    /* … */
}

Şimdi unset($images[$key]) ile öğeyi silebilirsiniz.

Eğer anahtarlar ve değerler hem can, foreach kullanırken zaman loop - Bir çözüm, bunları kaldırmak için öğelerin tuşunu kullanmak olacaktır.

Örneğin:

$arr = array(
    'a' => 123,
    'b' => 456,
    'c' => 789, 
);

foreach ($arr as $key => $item) {
    if ($item == 456) {
        unset($arr[$key]);
    }
}

var_dump($arr);

Sonunda, bu dizi verecektir:

array
  'a' => int 123
  'c' => int 789


Which means that, in your case, something like this should do the trick :

foreach($images as $key => $image)
{
    if($image == 'http://i27.tinypic.com/29yk345.gif' ||
    $image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
    $image == 'http://i42.tinypic.com/9pp2456x.gif')
    {
        unset($images[$key]);
    }
}

foreach($images as $key=>$image)                                
{               
   if($image == 'http://i27.tinypic.com/29ykt1f.gif' ||    
   $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' ||    
   $image == 'http://i42.tinypic.com/9pp2tx.gif')     
   { unset($images[$key]); }                               
}

! $ Anahtar => $ resim olarak foreach ($ görüntüleri

neden $ resim değeri, yani $ görüntüleri [$ image] hiçbir mantıklı.

Sen diziden çıkarmak için bir başvuru kullanabilirsiniz, size $list değişkeni kullanmak dahaki sefere, dizi değişmiş olduğunu göreceksiniz.

Böyle bir şey deneyin

foreach($list as &$item) {

   if($item['status'] == false) {
      unset($item);
   }

}

Maalesef geç cevap için, ben son zamanlarda php ile aynı sorun vardı ve öğrendim ki sen döngü gerçek kopya pozisyon değerini foreach döngüsünü kullanarak, $ anahtar => $ değer yapısı kullanmayan dizilerle çalışırken değişkeni, bu durumda $ görüntüde. Bu kodu kullanmayı deneyin ve bu sorunu çözecektir.

for ($i=0; $i < count($images[1]); $i++) {

if($images[1][$i] == 'http://i27.tinypic.com/29yk345.gif' ||

    $images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' ||

    $images[1][$i] == 'http://i42.tinypic.com/9pp2456x.gif')

{

    unset($images[1][$i]);

}

}

var_dump ($ resim); die ();

Ayrıca gerekir

$i--;

Her unset / Bir eleman atlamak değil sonra

Çünkü ne zaman unset $item[45], sonraki eleman için döngü olmalıdır olmak $item[45] - ki [46] unsetting önceydi. Eğer bunu yapmaz, her zaman unsetting sonra bir öğeyi atlamak istiyorum.