質問するログイン新規登録

回答編集履歴

3

追記部分への対応

2017/09/23 00:34

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -37,4 +37,20 @@
37
37
  yubaさんの言うようにリスト操作用のメソッドを利用していくのがベースになる。
38
38
 
39
39
  高速なライブラリや関数を作るならforやwhileを使いまくりになると思うけどね。
40
- もちろんその分のテストもすべきだし、ライブラリの中身は可読性ガン無視で良いわけでもないから考えて使うのは重要だと思う。
40
+ もちろんその分のテストもすべきだし、ライブラリの中身は可読性ガン無視で良いわけでもないから考えて使うのは重要だと思う。
41
+
42
+ ---
43
+
44
+ 追記部分への対応
45
+
46
+ > 何回繰り返すか、決まっている場合でwhileでは無理のある場合のみforで良い。
47
+ という感じですかね。
48
+
49
+ for文の速度に関しての言及は特に無かったけど、別にwhileだから速いということは無い。
50
+ 言語にもよるけど、コンパイラが解釈して同じマシン語に変換されるので同じ速度になる可能性もある。
51
+
52
+ もっと言うと、for文で1箇所にまとめた方が良いマシン語に変換されて速く動作する可能性すらある。
53
+ 本当に速度を気にするならちゃんとコンパイラの実装まで確認した方がいい。
54
+ (私は確認したこと無いけど、100万回程ループ回して比較しているベンチマーク記事とか結構あるからね)
55
+
56
+ なんとなくwhileの方がやってること少ないから速そうだからと、何でもかんでもwhileで書くのはやめて、まずは可読性の事を考えよう。

2

JSを追記

2017/09/23 00:34

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -1,15 +1,40 @@
1
- PHPでやるなら99%の状況でforeach。
1
+ PHPでやるなら9割の状況でforeach。
2
+ なぜならばPHPがHTMLの動的生成がゴールになることが多い以上、配列を触る状況が殆どだから。
2
3
 
3
- なぜならばwhileやfor文は何度動作するのかを常に把握し続ける必要がある、
4
+ whileやfor文は何度動作するのかを常に把握し続ける必要がある、
4
- 1回多くループが回っても、1回少なくループが回っても重篤な不具合が発生するケースはある
5
+ 1回多くループが回っても、1回少なくループが回っても駄目
5
- 状態変数が増えてソースコードが読みづらくなるわ、不具合が発生しやすくなる。
6
+ 状態変数が増えてソースコードが読みづらくなった結果、不具合が発生しやすくなる。
6
- (特に九九の掛け算や多次元配列を操ろうとすると一気にネストが深くなり複雑る)
7
+ (特に九九の掛け算や多次元配列を操ると一気にネストが深くなり状態変数も一気増える)
7
8
 
8
- その点foreachなら最初から何度ループが回るかが一目。
9
+ 配列操作に限定されるけどforeachを使えば何度ループが回るかが一目。
9
- 配列のアイテムやキーが既に取り出せた状態から始まるから状態変数の管理も不要といい事ずくめ。
10
+ 配列のアイテムが既に取り出せた状態から始まるから状態変数の管理も不要といい事ずくめ。
10
- また頻出の配列操作をする場合はforやwhileと比較してもほぼ等速なのでforeach以外を使う意味がない。
11
+ またforやwhileと比較してもほぼ等速なのでforeach以外を使う意味がない。
11
12
 
12
- 残り1%のケースは速度がどうしても遅いからチューニングする事になって、
13
+ 残り僅かのケースは速度がどうしても遅いからチューニングする事になって、
14
+ 無からわざわざ`range(1, 10)`みたいな事をしてforeachを使うのは賛否両論があるから、`for ($i = 0; $i < 10; $i++)`はわざわざ避ける必要はない。
13
- fopen、feofみたいな低級関数(低俗という意味ではなく、マシン語に近いという意味ね)を使う場合。
15
+ fopen、feofみたいな低級関数(低俗という意味ではなく、マシン語に近いという意味ね)を使う場合はwhileがよく使われる
14
16
 
15
- JavaScriptでやる場合for...ofやfor...inを使っていくとPHPのforeachと同じ事が出来
17
+ まぁ、PHPは多くの[配列操作用のビルトイン関数](http://php.net/manual/ja/ref.array.php)が揃っているから、
18
+ 筋の良い関数を使ってワンライナーで書ける場合はforeachすら不要。
19
+ 下記の関数が一例(他にもあるかも)
20
+
21
+ - [array_chunk](http://php.net/manual/ja/function.array-chunk.php)
22
+ - [array_column](http://php.net/manual/ja/function.array-column.php)
23
+ - [array_combine](http://php.net/manual/ja/function.array-combine.php)
24
+ - [array_search](http://php.net/manual/ja/function.array-search.php)
25
+
26
+ yambejpさんの一例は賛否あるだろうけど個人的には好き。
27
+ PHPならではの良さを考えると富豪的で分かりやすい手法はあって良いと思う。
28
+
29
+ ---
30
+
31
+ JavaScriptもDOM操作の元になる配列を作ったり、Ajax通信でPHPからJSONを貰ってきて解析する事が多い。
32
+ やはり配列の操作がメインになるから純粋な配列やオブジェクトを用意して、`for (;;)`やwhileを避けて開発するべきだね。
33
+ (こねくり回した不順な配列やオブジェクトはthink49さんが言うようにfor...in等でprototypeが紛れ込む罠がある)
34
+
35
+ JavaScriptでやる場合[for...of](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of)や[for...in](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...in)を使っていくとPHPのforeachと同じ事が出来る。
36
+ ただ、for...ofは古いブラウザに非対応だし、for...inはkeyが来るのでPHPのforeach程汎用的に使えるわけじゃない。
37
+ yubaさんの言うようにリスト操作用のメソッドを利用していくのがベースになる。
38
+
39
+ 高速なライブラリや関数を作るならforやwhileを使いまくりになると思うけどね。
40
+ もちろんその分のテストもすべきだし、ライブラリの中身は可読性ガン無視で良いわけでもないから考えて使うのは重要だと思う。

1

JSを追加

2017/09/21 02:10

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -10,4 +10,6 @@
10
10
  また頻出の配列操作をする場合はforやwhileと比較してもほぼ等速なのでforeach以外を使う意味がない。
11
11
 
12
12
  残り1%のケースは速度がどうしても遅いからチューニングする事になって、
13
- fopen、feofみたいな低級(低俗という意味ではなく、マシン語に近いという意味ね)を使う場合。
13
+ fopen、feofみたいな低級関数(低俗という意味ではなく、マシン語に近いという意味ね)を使う場合。
14
+
15
+ JavaScriptでやる場合for...ofやfor...inを使っていくとPHPのforeachと同じ事が出来る。