75

配列を通過するように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
        )

)

ありがとう!

4

9 に答える 9

91
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]);
    }
}
于 2010-01-05T20:33:31.117 に答える
69

それを試してください:

foreach ($images[1] as $key => &$image) {
    if (yourConditionGoesHere) {
        unset($images[1][$key])
    }
}
unset($image); // detach reference after loop  

通常、foreachアレイのコピーを操作するため、変更を加えてもそのコピーに加えられ、実際のアレイには影響しません。

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

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

于 2010-01-05T20:34:41.053 に答える
11

最初の質問 (編集後) に答えるには、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 ループ内で正しい設定を解除すると、すべて正常に動作します。

于 2016-02-22T17:19:15.850 に答える
6

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

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

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

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

}
于 2014-01-03T17:43:44.863 に答える
4

$imageあなたの場合、キーではなくアイテムの価値です。次の構文を使用して、キーも取得します。

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

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

于 2010-01-05T20:34:05.797 に答える
1

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]は意味がありません。

于 2010-01-05T20:34:30.633 に答える
1

また、

$i--;

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

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

于 2012-03-06T22:52:42.280 に答える
1

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]);
    }
}
于 2010-01-05T20:34:59.397 に答える
0

$key => $value返信が遅くなり申し訳ありません。最近、PHP で同じ問題が発生し、構造体を使用しない配列を操作する場合、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();
于 2011-10-26T21:45:59.830 に答える