Objective-CとPHPの高速列挙(foreach文)は順番(参照順序)が保証される


高速列挙の順番(参照順序)の保証についてです。
最近この件でブログに来られる方が多いみたいなのでもう一度整理してみます。

高速列挙とはリストやハッシュテーブルなどのデータ構造の各要素に対して与えられた文の実行を繰り返すというループを記述するための文です。
foreach文と呼ばれることもあります。

記述が簡単で普通のループ文(for文)より高速に動作するため多用したくなるのですが、注意しなければならないのは必ずしも順番(参照順序)が保証されない点です。
例えば配列の値を添え字(インデックス)の順に+1ずつ加算していきたいような場合順番が保証されないと意味がありません。

順番が保証されるかはプログラミング言語によって異なります。
複数の言語を使う場合とても紛らわしい話です。


ここでてぃーがよく使うプログラミング言語(Objective-C、PHP、Visual Basic、Visual C#)の高速列挙の順番(参照順序)の保証をまとめてみると次のようになります。
 
高速列挙の順番の保証

つまりObjective-CとPHPの高速列挙は順番(参照順序)が保証されます。
ただしすべて保証されるわけではないので注意です。(下記参照)



保証される根拠


ネットでは情報が錯綜していてObjective-CもPHPも高速列挙の順番は保証されないというデマ?もあり、よけいに混乱しますね(><)
Objective-CとPHPについて根拠を挙げます。


Objective-C
てぃーが以前勉強していたアップル公式の「Objective-Cプログラミング言語」にあります。
 →【勉強】Objective-Cプログラミング言語(その4/最終回)+おすすめの本

高速列挙の使用(98ページより)

明確な順序を持つコレクションや列挙子(配列から派生したNSArrayインスタンスやNSEnumeratorインスタンス)の場合、列挙はその順序に従って行われるため、必要な場合は反復をカウントするだけでコレクション内を指す正しいインデックスが得られます。


またiOS Developer LibraryのFast Enumerationの項目にも同様の記述があります。
(英語ですが)
 →The Objective-C Programming Language: Fast Enumeration

Using Fast Enumeration

For collections or enumerators that have a well-defined order—such as an NSArray or an NSEnumerator instance derived from an array—the enumeration proceeds in that order, so simply counting iterations gives you the proper index into the collection if you need it.


つまりNSArray、NSMutableArray、NSEnumeratorなどは順番が保証されますが、NSDictionaryなどは保証されないということです。


PHP
こちらも公式のページにあります。
 →PHP: foreach - Manual

「使用法を示すためにその他の例を示します。」の16行目(空行含む)

foreach ($a as $v) {
    echo "\$a[$i] => $v.\n";
    $i++;
}



なおこの根拠についてはTwitterで@omochimetaruさんに教えていただきました。
ありがとうございました。


(中略)






↓この記事が参考になったら拍手、ツイート、いいね、はてブ、いずれかをお願いします。今後のブログ作りに役立てたいので。
関連記事

コメントの投稿

非公開コメント

プロフィール

てぃー

Author:てぃー
詳しい自己紹介:こちら
Twitter:@teapipin


follow us in feedly 
にほんブログ村 IT技術ブログへ にほんブログ村 PC家電ブログへ
現在の閲覧者数:

ブログ内検索
今日のアクセス数の多い記事
カレンダー

09月 | 2017年10月 | 11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
過去記事ダイジェスト
お知らせ
ツイッター分析の分析結果が新潟大学教育学部の論文に引用
教育の実証研究の場でも高く評価!

ツイッター分析の分析結果が和歌山大学防災研究教育センターの論文に引用
防災の研究において評価!

2015年版ツイッター分析(世界編)が始動!
今回は世界の国別・言語別ツイートを分析!

ツイッター分析の分析結果が慶應義塾大学有名教授の研究論文などに引用
文系の研究までも制覇!

Interval Timer EX
有名雑誌「Mac Fan 2015月2月号」に「インターバルタイマーEX」が3度目の掲載!ポモドーロテクニックに有効!

自作Macアプリ3部作が2014年 Vector 年間ダウンロードランキング Mac トップ100にすべてランクイン

TimeCalcを公開しています!
時間計算、年齢計算、学歴欄作成など。

ツイッター分析の分析結果が人工知能の研究に!
ブログが学会発表で引用されました。

今まで開発したiPhoneアプリのソースコードを公開しています!
勉強に役立ててください。


2013年 Vector 年間ダウンロードランキング Mac トップ100に「デジカメ変更日を撮影日に一括変更 for Mac」と「インターバルタイマーEX」がランクイン

Interval Timer EX
有名雑誌「Mac Fan 2013月4月号」に「インターバルタイマーEX」が2度目の掲載!!

リアルタイムツイッター地図
リアルタイムツイッター地図を公開しています!
位置情報付きツイートをリアルタイムに表示します。

新たなツイッター分析としてイベントツイート分析を行っています!

2012年8月1日(水)開催の「Twitter勉強会」で発表
ツイッター調査:約173万ツイートを調査して分かったTwitterの利用動向 #twtr_hack from teapipin


Interval Timer EX
有名雑誌「Mac Fan 2012月3月号」に「インターバルタイマーEX」が掲載!!



 

はてなブックマークの人気記事