これはわかる。
$x=["bravo","charlie","alpha"];
print_r($x);
/*
Array
(
[0] => bravo
[1] => charlie
[2] => alpha
)
*/
sort($x);
print_r($x);
/*
Array
(
[0] => alpha
[1] => bravo
[2] => charlie
)
*/
これがわからない。
$x=["bravo","charlie","alpha"];
print_r($x);
/*
Array
(
[0] => bravo
[1] => charlie
[2] => alpha
)
*/
asort($x);
print_r($x);
/*
Array
(
[2] => alpha
[0] => bravo
[1] => charlie
)
*/
foreach($x as $y) echo $y,"\n"
/*
alpha
bravo
charlie
*/
つまりPHPには配列などない。すべて順序付きハッシュだ。
なので、数値で直接indexを与えても、foreachはindexの順に処理されないのだった。
$x[2]="bravo"
$x[3]="charlie"
$x[1]="alpha"
foreach($x as $y) echo $y,"\n";
/*
bravo
charlie
alpha
*/
なるほど。むしろ順序が保証されてるから楽なのか。
ググったらみんな同じような発見をしている様子。
しかしそういう自由な使い方ができるという意味では、要素数とcount()が一致しない場合とか、インデックスが0から始まらない場合もあるだろうから、
for($i = 0; $i < count($array); $i++) {
echo $array[$i];
}
みたいにcount()とforで回すのは良くないのでは。例えば上の例から引っ張ってくると
$x[2]="bravo";
$x[3]="charlie";
$x[1]="alpha";
for($i=0;$i<count($x);$i++) echo $x[$i],"\n";
/*
PHP Notice: Undefined offset: 0 in Command line code on line 1
alpha
bravo
*/
この場合はksort()を使えばいい。
$x[2]="bravo";
$x[3]="charlie";
$x[1]="alpha";
ksort($x);
foreach($x as $y) echo $y,"\n";
/*
alpha
bravo
charly
*/
改めて見るとキーのキャストもなかなか難しい雰囲気。整数値と文字列だけキーにして、nullと空文字に気をつけるのがベターか。