2009-05-28 9 views
1

配列を反復処理する方法はありますが、他のすべての要素に対して操作を実行する方法はありますか? ie要素が13個の配列を持っている場合、要素2,4,6,8,10、および12に対してのみ何かを行うにはどうすればよいですか?PHPで配列の選択的な反復

答えて

0

は、より高速のために答えると誤字修正:

for ($i = 1, $j = count($array); $i < $j; $i += 2) { 
    // code 
} 
+0

これから何かを学び、最初の式(またはそれ以降の変数)に複数の変数を割り当てることはできませんでした。ありがとう! –

+2

スピード?最高でも、配列サイズを「キャッシュする」ことはマイクロ最適化です。意味的にも同等です。ループ中に配列のサイズが変わるとどうなりますか? – cletus

+0

@phil、np。喜んで助けてください:) @cletusループ中に配列が変更された場合は、ループ内でforeachまたはupdate $ jを使用する必要があります。速度最適化と有効なものです。 1000000の値の配列を想像してみてください。 – Ozzy

1
for ($i=1; $i<sizeof($array); $i+=2) { 
    // do stuff to $array[$i] 
} 

あなたもforeachループに統合することができます

$i = 0; 
foreach ($array as $v) { 
    if ($i++ & 1) continue; 
    // do stuff to $v 
} 

注:$i & 1($i % 2) == 1(または単に$i % 2)に相当します。 cletusesを修正する

+0

ステートメントの最後の部分は$ i + = 2ですか? – musoNic80

+0

わかりませんforeachの例があります。もう少し簡単に私に説明できますか? – musoNic80

+1

基本的にfor()ループとは異なり、foreach()ループはインデックスカウンタを持たないため、代理インデックスとして$ iが使用されます。繰り返しごとに増分されます。 $ i&1は値1、3、5、7に対してtrueを返します。0から始まるので、2番目の要素ごとにtrueを返します(スキップすることを意味します)。 – cletus

3
foreach($array as $val) { 
    if(($i++ % 2) == 0) { 
    ...do stuff here... 
    } 
} 
+0

これは、中括弧を除いて私がやる方法です。ロジックは単純ではありません。これは、ループロジックを書き直さずに、elseで拡張するのが簡単であることを反映しています。 – Kris

+0

回答は素晴らしいです、ありがとう。現実世界の例を追加することはできますか? 私は週の各曜日に2つの要素を持つ配列を持っています。 (番号付けは0から始まる)。私はそれぞれの要素ではなく、毎日何かをするル​​ープが必要です。これを達成するためにあなたが与えた答えをどのように使うことができますか? PSまだ投稿するコードはありません、私はちょうどそれを最初に試してみようとしています! – musoNic80

+0

あなたの配列も同じように見える場合 $ array = array( 'mon1'、 'mon2'、 'tue1'、 'tue2' ... 'fri2');常に異なるパターンに従うと、そのコードを書かれたとおりに使用することができます。あなたが毎日ヒットしていることを確認したい場合は、何とかそれを検証する必要があります。何が入っているのか、何をしたいのかを本当に分からずに言うのは難しいです。 –

0

フィル・カーターの答えと同様にすでに掲載の回答の別のバリエーションを...。配列に数値インデックスがある場合は、個別のカウンタ変数を管理する代わりにforeachでそのインデックスを使うことができます:

foreach ($array as $i => $v) { 
    if (! ($i % 2)) { 
    // do stuff to $v 
}