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
)
)
ありがとう!
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]);
}
}
それを試してください:
foreach ($images as $key => &$image) {
if (yourConditionGoesHere) {
unset($images[$key])
}
}
通常、foreachは配列のコピーを操作するため、変更はそのコピーに対して行われ、実際の配列には影響しません。
したがって、$ images [$ key]を使用して値を設定解除する必要があります。
&$ imageの参照により、ループがメモリを浪費する配列のコピーを作成することを防ぎます。
最初の質問(編集後)に回答するには、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ループ内で正しい設定を解除すると、すべてが正常に機能します。
配列要素のインデックスを使用して配列から削除できます。次回$list
変数を使用すると、配列が変更されていることがわかります。
このようなものを試してください
foreach($list as $itemIndex => &$item) {
if($item['status'] === false) {
unset($list[itemIndex]);
}
}
_$image
_は、キーではなくアイテムの値です。キーも取得するには、次の構文を使用します。
_foreach ($images as $key => $value) {
/* … */
}
_
これで、unset($images[$key])
を使用してアイテムを削除できます。
あなたも必要になります
$i--;
要素をスキップしないように設定解除するたびに/
$item[45]
の設定を解除すると、forループの次の要素は$item[45]
になります。これは、設定解除前の[46]
でした。これを行わない場合は、設定解除後に常に要素をスキップします。
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つの解決策は、アイテムのキーを使用してそれらを削除することです。 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]);
}
}
応答が遅くなって申し訳ありませんが、最近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();