2009-04-24 7 views
6

は、私はこのような何かをしたい:PHPで "foreach x except y"を行う最もエレガントな方法は何ですか?

foreach ($array as $key=>$value except when $key="id") 
{ 
// whatever 

} 

を...ループ本体内の「if」節を入れなくても。 "id"が配列の最初または最後の要素になることは保証されていません。元のデータを維持するのではなく、高価で醜いので、配列の設定を解除またはスライスしたくはありません。私は間違いなくループ内でキーと値の両方を使う必要があります。

アイデア?

答えて

14

私がもし節はこのような問題であるとは思わない:IF-と

$loop_array = array_diff_key($actual_array, array('ignore_me' => NULL, 'ignore_me_2' => NULL)); 
foreach ($loop_array as $key => $value) { 
    #... 
+1

これはうまくいくはずですが、スタックの別のコピーが作成されるため、スタックを増やす必要があります。 – Alnitak

+0

は高価に見えます... – Thilo

+0

はい、それを反映するように変更されました。 – soulmerge

2

私はあなたがいつも内部ループにIF句を使用すると思います。あなたがすでに与えてくれたすべてのオプションのうち、スピードとメモリ消費のために私が使用するのは唯一のものです。

1

AFAIKループ内にifがなければ実行できません。

キーワードのように、「for each」、「for most」ではありません。

EDITは:soulmergeが言うように、あなたはarray_diff_key()でそれを行うことができ、しかし、あなたは、単一のキーを逃している場合、それはただのループでifを置くよりも詳細かつ少ないメモリ効率的です。

5

行く:あなたは空想のソリューションをしたい場合は

foreach ($array as $key => $value) { 
    if ($key == 'ignore_me') continue; 
    if ($key == 'ignore_me_2') continue; 

、あなたが使用することができますarray_diff_keyループの内側にある句。 それについて不愉快なことは何もありません。読むのが最も簡単で理解しやすく、最も効率的です。あなたは(IF-句で)に対してテストするための第2のハッシュ構築することができスキップする多くのキーがある場合は

foreach ($array as $key => $value) { 
    if (array_key_exists($key,$skip_keys)) continue; 
    ... 
} 
0

if文を圧縮する別の方法を次のとおりです。

// ignore 1,5,8,9 
foreach($arr as $key){ 
    if(in_array($key, array(1,5,8,9)) continue; 
    ... 
} 
関連する問題