配列(リスト)の要素を1つずつ処理するには 2021/01/24
Java、Scala、JavaScript、PHP、Smarty、Perl、CoffeeScript、Ruby、Pythonでの配列(リスト)の要素を1つずつ順番に処理する方法。
for
文などの繰り返しの構文が使える言語が多い。
配列やリストの要素に対してではなく、0から順番にカウンタを回して繰り返し処理をさせる方法はfor
文を参照。
Java 2014/03/15
配列をfor
文でループする例
for(int i = 0; i < strArr.length; i++){
String str = arr[i];
...;
}
java.lang.Iterator
を使った例
for(Iterator<String> it = strList.iterator(); it.hasNext();){
String str = it.next();
...;
}
Java5からは、以下の拡張for文の利用が可能。(foreach構文)
for(String str: strArr){
...;
}
拡張for文の場合 strArr
は配列であるか、java.lang.Iterable
を実装しているオブジェクトであることが必要。
Scala 2015/01/13
List
やMap
などたいていのコレクション型にあるforeach
メソッドを使えばよい。
def scala.collection.Seq[A]#foreach(f: A => Unit): Unit
foreach
の引数には関数を渡すが、Scalaでは関数をいろいろな書き方ができるので、慣れないとわかりづらいかもしれない。以下はいろいろな書き方の例。
val lst = "a" :: "b" :: "c" :: Nil;
lst.foreach { (s: String) => println(s); }
// {} でなくて () でもよい
lst.foreach((s: String) => println(s));
// 関数の引数の型は推論ができれば省略できる
lst.foreach((s) => println(s));
// 関数の引数が1つであれば括弧を省略できる
lst.foreach(s => println(s));
// 関数の引数を1回しか使わない単純な関数であれば _ と書ける
lst.foreach(println(_));
// メソッド名だけ
lst.foreach(println);
一番下は、Perlみたいに省略されまくっているが、Perlの $_
のような暗黙の変数があるのではなく、高階関数の引数のように関数を書くべき場所に単にメソッド名だけを書ける機能である。
foreach
メソッドの代わりにfor
式を使ってもよい。
for (elem <- list) {
...;
}
for
式はコンパイラ内部ではforeach
メソッドの呼び出しに変換されている。
JavaScript 2021/01/24
例
for (const elem of arr) {
...;
}
または
for (index in arr) {
const elem = arr[index];
....;
}
of
の左にくるのは要素の値。in
の左にくるのは要素のインデックス。
PHP 2015/01/13
配列をループする例
foreach ($arr as $elem) {
...
}
インデックスと値の両方を変数に入れることもできる。
foreach ($arr as $index => $elem) {
...
}
この書き方は普通の配列でなくて連想配列の場合に特に便利。
中括弧({}
)の代わりに以下のようなコロンを使った記法も可能。
foreach ($arr as $elem):
...
endforeach;
または別の書き方としてC言語風に
for ($i = 0; $i < $arr.length; $i++) {
...
}
ループの中で要素の変数名に値を代入しても配列には影響しないが、&$elem
というふうに書くと、配列に変更を反映させることができる。
$arr = array(10, 20, 30);
foreach ($arr as $elem) {
$elem = $elem * 10; # この書き方では配列自体には影響しない
}
var_export($arr);
# => array (
# 0 => 10,
# 1 => 20,
# 2 => 30,
# )
foreach ($arr as &$elem) { # &$elem と書いて参照渡しにする
$elem = $elem * 10; # 配列に影響する
}
var_export($arr);
# => array (
# 0 => 100,
# 1 => 200,
# 2 => 300,
# )
Pythonのアンパック代入のように as
の右に list()
形式を置くことはPHPではできない。と思ったが、PHP5.5からはできるようになるらしい。
Smarty 2013/09/04
{foreach $arr as $value}
...
{foreachelse}
<!-- $arr に要素がひとつもなかった場合 -->
...
{/foreach}
ループの最初と最後にだけ特別な処理を入れたい場合、foreach
の中で name=hoge
のように書くと $smarty.foreach.hoge
を使って、処理を振り分けられる。
{foreach $arr as $value name=item}
{if $smarty.foreach.item.first}
<!-- 最初の要素の場合 -->
...
{/if}
...
{if $smarty.foreach.item.last}
<!-- 最後の要素の場合 -->
...
{/if}
{/foreach}
Perl 2015/01/22
my @arr = ('abc', 'def', 'ghi');
foreach my $elem (@arr) {
...;
}
変数名を省略した以下の書き方も可能。この場合、ループの中では要素を $_
で参照する。
my @arr = ('abc', 'def', 'ghi');
foreach (@arr) {
...;
}
以下のように修飾子の書き方も可能。この書き方でもループの中では要素を $_
で参照する。
... foreach (@arr);
配列のレファレンスに対して繰り返し処理をしたい場合は、@arr
の代わりに @$arr
のように書けばよい。
Perlでは for
と foreach
はまったく同じなので、上記のどの例でも foreach
を for
にしても同じになる。
CoffeeScript 2016/03/03
配列をループする例
for elem in arr
....
JavaScriptと違って in
の左にくるのは要素の値。
Ruby 2014/12/31
for elem in arr do
...
end
do
は省略してもよい。
elem
の部分には複数の値が入る場合に複数の変数が使える。例:
for i, str in [[1, 'abc'], [2, 'def'], [3, 'ghi']]
...
end
配列の Array#each
メソッドも使える。break
でのループの中断は、上記のfor
文以外にこのeach
メソッドでも使える。
[1, 2, 3].each do |i|
p i
break if i == 2
end
# => 1 2
Python 2014/08/01
for
文の例
for elem in lst:
...
...
lst
にはリスト、タプル、文字列といったシーケンスを使うことができる。文字列に使うと、その中の1文字ずつでループ処理する。
シーケンス以外にもイテレータ型を使うこともできる。
lst
の要素がさらにリストやタプルなどになっていれば、elem
には複数の変数を書くことができ、要素ごとにアンパック代入されてループが実行される。
lst = [[3, "abc"], [4, "def"]]
for a, b in lst:
print(a, b)
# 出力結果
# 3 abc
# 4 def
変数のスコープは関数なので、elem
に最後に代入された要素はfor
文から脱出後もそのまま保持される。
while
文と同じく、else
節を付けることができる。else
節は条件を満たさなくなってループを脱出する際に実行される。要素が1つもない場合ではない。ループからbreak
で脱出した場合は実行されない。
for elem in lst:
...
...
else:
...
...
for
文 | Python 2.7 documentation
for
文 | Python 3 documentation
sh (シェルスクリプト) 2013/10/22
例1
for v in foo bar hoge
do
echo $v
done
例2 (スペース区切りの文字列に対して繰り返し処理)
list="foo bar hoge"
for v in $list
do
echo $v
done
出力結果(どちらも同じ)
foo
bar
hoge