10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPには配列がなかった

Posted at

これはわかる。

$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と空文字に気をつけるのがベターか。

10
12
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?