2012.
01.
06
10:53:45
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、おもしろっ(*´ェ`*)
連想配列に並び順の保証は無い
って。
私も何となくそう思っていたのですが、
よく考えたら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、おもしろっ(*´ェ`*)