人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで連想配列に値を入れ、以下のようにforeachで回すと、$dataに代入された順に
「hoge1 hoge2 hoge3」と出力されますが、この順番は将来に渡って保証されているものなのでしょうか?

perlの場合保証されていない、ということを聞いたので気になりました。
保証されている場合、参考資料などありましたら教えて下さい。

また、この代入の順番を期待するようなやり方は、通常の配列($data[0]など)を
使ってやるのがセオリーなのでしょうか。よろしくお願いします。

$data = array('hoge1'=>'1','hoge2'=>'2','hoge3'=>'3');

foreach ($data as $key => $value) {
echo $key." ";
}

■結果
hoge1 hoge2 hoge3

●質問者: xxmasaxx
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:as echo Key Perl PHP
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● pahoo
●20ポイント

保証されません。

たまたま、ご利用の環境で保証されているように見えても、他の環境(とくにPHPのバージョンやOSが異なる場合)で動作させたときの保証はありません。


ご質問にあるように配列のキーを整数にしたとしても、foreach で回す場合にはキー順になるかどうかは保証されません。

事前にソートするか、for 文で回すのが無難です。

◎質問者からの返答

回答有り難うございます。うーむ保証されないのですか。

参考にさせて頂きます。


2 ● b-wind
●20ポイント

この順番は将来に渡って保証されているものなのでしょうか?

保証される。


PHP: ?????? - Manual

PHP の連想配列はいわゆる連想配列と内部的に大きく違う。

キーの順序は保証され、配列と連想配列に内部的には区別がない。配列は数字のみをキーとした連想配列に過ぎないからだ。

配列と連想配列の混合データすら作成可能だ。

このような構造は他の言語ではほとんど見られない。

良いか悪いは分からないが、そのようなデータ構造になっている。

実際にそれぞれの時点でどのような内部表現になっているかは var_dump 関数を用いると分かるようになっている。

PHP: var_dump - Manual


perlの場合は連想配列はシンプルにキーから値を取り出すことのみを保証しているだけなので、

キーの順序は保証されない。

もちろん実装として保証する物が存在する可能性はあるが、少なくとも Perl 言語の仕様ではない。

◎質問者からの返答

リンク先拝見しました。

明示的に順番は保証されているという記述は見つかりませんでしたが、

PHPでは配列と連想配列は一緒なんですね。なるほど。参考にさせて頂きます。

回答有り難うございました。


3 ● yofukaci
●20ポイント

PHP言語で規定されてない限り、保証はされません。

また、現状のバージョンでも保証はされません。

◎質問者からの返答

ネットで検索してみると、サイトによっては順番どうりになる、ならないと分かれるようで、正直分からなくなりました。。

ともあれ回答有り難うございました。参考にさせて頂きます。


4 ● ymlab
●20ポイント

http://www.itl.dm.u-tokai.ac.jp/~hiroshi/education/sprg/txt/sp06...

5.7章 配列の順次処理

によると、

for と違って処理順は意識されないが,内部順序に基づいて処理される.

と書いてあるので、連想配列であるなしに関わらず意識はされないようです。

私もそういうときは、面倒だと思いつつ、

連想配列をおforeachで回して配列に入れ直してソートしています。

asortを使った方が速いかも知れませんが・・・。

http://php.benscom.com/manual/ja/function.asort.php

◎質問者からの返答

「内部順序」が具体的にどういう仕組みなのか、ちょっと気になりました。

ソートしなければならないとなると、ちょっと面倒っぽいですね。。回答有り難うございます。


5 ● takano32
●20ポイント

保証されません。

内部のデータ構造について言及されてい方もいらっしゃるようですが、そのデータ構造自体が変化しないことが保証されていません。内部の構造は隠蔽されていると考え変更の対象となることも多いでしょう。

foreach という言葉の定義から外れることはないと思いますので、それぞれの要素について処理を施すという用途にのみ用いたほうがよいでしょう。

# 極論では foreach という構文についても将来的にこの構文が残ると確実に保証されることはありません。

◎質問者からの返答

そもそもPHP自体バージョンが上がると色々変わるので、

それらを念頭に入れて開発したほうがよさげですね。

回答有り難うございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ