web-dev-qa-db-ja.com

foreachループで配列値を設定解除する

Foreachループを設定して配列を調べ、特定のリンクを確認し、見つかった場合はそのリンクを配列から削除します。

私のコード:

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

ただし、配列全体は削除されません。それはおそらく$images[$image]と関係があるのでしょう。それは配列エントリのキーではなく、コンテンツだけなのでしょうか?カウンターを組み込むことなくこれを行う方法はありますか?

ありがとう。

編集:ありがとう.

私の新しいコード:

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

$ imagesは実際には2次元配列なので、なぜ$ images [1]が必要なのか。私はチェックしましたが、配列要素をうまく回り、いくつかの要素には実際に削除したいURLがありますが、削除されていません。これは私の$images配列です:

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
        )

)

ありがとう!

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

それを試してください:

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

通常、foreachは配列のコピーを操作するため、変更はそのコピーに対して行われ、実際の配列には影響しません。

したがって、$ images [$ key]を使用して値を設定解除する必要があります。

&$ imageの参照により、ループがメモリを浪費する配列のコピーを作成することを防ぎます。

55
selfawaresoup

最初の質問(編集後)に回答するには、unset($ images [1] [$ key]);

PHPの仕組み:foreachループで配列の要素を安全に設定解除できます。配列項目の有無は関係ありません。このコードを参照してください。

$a=[1,2,3,4,5];
foreach($a as $key=>$val)
{
   if ($key==3) unset($a[$key]);
}
print_r($a);

これは印刷します:

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

ご覧のとおり、foreachループ内で正しい設定を解除すると、すべてが正常に機能します。

6
Tomas M

配列要素のインデックスを使用して配列から削除できます。次回$list変数を使用すると、配列が変更されていることがわかります。

このようなものを試してください

foreach($list as $itemIndex => &$item) {

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

}
4
webmaster

_$image_は、キーではなくアイテムの値です。キーも取得するには、次の構文を使用します。

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

これで、unset($images[$key])を使用してアイテムを削除できます。

4
Gumbo

あなたも必要になります

$i--;

要素をスキップしないように設定解除するたびに/

$item[45]の設定を解除すると、forループの次の要素は$item[45]になります。これは、設定解除前の[46]でした。これを行わない場合は、設定解除後に常に要素をスキップします。

2
murph.vienna

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

!! foreach($ images as $ key => $ image

原因は$ imageなので、$ images [$ image]は意味がありません。

1
Peter Porfy

1つの解決策は、アイテムのキーを使用してそれらを削除することです。 foreach を使用してループする場合、キーと値の両方を使用できます。

例えば ​​:

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

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

var_dump($arr);

最後に、この配列を提供します:

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


これは、あなたの場合、次のようなことがうまくいくことを意味します。

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]);
    }
}
1
Pascal MARTIN

応答が遅くなって申し訳ありませんが、最近PHPで同じ問題が発生しました。$key => $value構造を使用しない配列を使用する場合、foreachループを使用すると実際のコピーループ変数の位置の値(この場合は$image)このコードを使用してみて、問題を解決します。

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($images);die();
0
jameslimousin