プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、連想配列の並び順序あれこれ
Perlとかやってる人は直感的に考えると思うのですよ。

連想配列に並び順の保証は無い

って。
私も何となくそう思っていたのですが、
よく考えたらPHPの連想配列は並び順保持されるよね(--?

そもそもPHPでは配列と連想配列ってぶっちゃけ同じだし
連想配列(配列)をソートする関数があるってことは
連想配列にも並び順の概念があるんじゃね(--?

ってな疑問が湧いたので真面目に調べてみました。
ホントのところはどーなのよ。

結果、連想配列にもインデックス(っぽい考え方)があるようです。

つまり

  $h['key1'] = 'val1';
  $h['key2'] = 'val2';
  $h['key3'] = 'val3';


とかやってみた場合、内部的には

  インデックス0、キー→'key1'、値→'val1'
  インデックス1、キー→'key2'、値→'val2'
  インデックス2、キー→'key3'、値→'val3'


になるイメージ。
だからforeach文で

  foreach($h as $key => $value){
   print $key . ":" . $value . "<br />";
  }


とかやると、結果は

  key1:val1
  key2:val2
  key3:val3


ってな感じで突っ込んだ順番に引っ張れる訳です。

さて、ここで問題(--)b

  $array[3] = 'あ';
  $array[2] = 'い';
  $array[1] = 'う';
  $array[0] = 'え';


  foreach($array as $key => $value){
    print $key . ":" . $value . <br />";
  }


とやると結果はどうなるでしょうか?
今度は配列の添え字に対して値を設定してみましたよ。

正解はこちらφ(--)

  3:あ
  2:い
  1:う
  0:え


になります。

そーです。
PHPの場合は配列も連想配列なのです。
つまりイメージとしては

  インデックス0、キー→3、値→'あ'
  インデックス1、キー→2、値→'い'
  インデックス2、キー→1、値→'う'
  インデックス3、キー→0、値→'え'


になるのですよ。
これに普通の配列っぽい順番でアクセスしたい場合はfor文にして下さい。

  for($i = 0; $i < count($array); $i++){
    print $i . ":" . $array[$i] . "<br />";
  }


とかやれば

  0:え
  1:う
  2:い
  3:あ


になります。

実は私、元々連想配列とforeachの組み合わせが好きな人なので
添え字指定の配列的な使い方ってあんまりしないのですよね。
なもんで意識しなくてピンチになることは無かったのですが
配列的な使い方が好きな方はご注意下さい。

ポイントは、PHPの場合

1.配列も連想配列
2.連想配列にも並び順の概念がある


です(--)b

ちなみにこれはあくまでPHPで取り扱う「連想配列」の場合です。
世間一般で言われる「連想配列」の場合は並び順は保持されないのが普通。

もっと言うと「PHPの連想配列でも並び順は保証されねーよ」みたいな意見も見かけますが
そのように仮定するとソート系の関数がある理屈が分からなくなります。
PHPで言う「配列」はあくまでキーがindex(数字で0から始まる連番)の連想配列なだけで
配列の要素番号は並び順には関係無いですしね。

更にツッコミが怖いので補足しておくと、便宜上「インデックス」とか言って数字振りましたが
実際にはnextポインタ、prevポインタくらいしか持っていないんじゃないかと思っています。
foreachはnextポインタを辿って行くことで順番に要素を参照しているだけ。
なもんで「今の要素から3つ先の要素」とかへ直接アクセスすることは無理なんでしょう。
それがやりたきゃキーに連番を振った連想配列(つまりは配列)でやれってことじゃないかと。

最後におまけです(--)b
これの結果はどうなると思います?φ(・∀・)

  $h2['key1'] = "val1";
  $h2['key2'] = "val2";
  $h2['key3'] = "val3";
  $h2[0] = "val4";
  $h2[] = "val5";

  foreach($h2 as $key => $value){
    print $key . ":" . $value . "<br />";
  }


正解はこちらですφ(--)

  key1:val1
  key2:val2
  key3:val3
  0:val4
  1:val5


PHP、おもしろっ(*´ェ`*)
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事