PHPの配列とは?
これまでのデータ型が1つの変数に1つの値を入れていたのに対して、配列は1つの変数の中に複数含めることができます。
箇条書きのようなリストやハッシュ値(キー名と値の組み合わせ)などをいれることができます。
PHPの配列には通常の「配列」と「連想配列」という2種類があります。
①通常の配列(リスト)
通常の配列の初期化(宣言)
通常の「配列」はイメージとしてはこんなものです。
シンプルな果物リストです。
りんご |
みかん |
バナナ |
キウイ |
PHPでこの配列を初期化(宣言)するには以下のようにします。
//初期化方法① 昔からの記述方法。全バージョンのPHPで記述可能
$list = array("りんご", "みかん", "バナナ", "キウイ");
array()の部分はPHP5.4以降であればブラケットを使った[]も使えます。
//初期化方法② ブラケット[]での配列初期化が使えるのはPHP5.4以降
$list = ["りんご", "みかん", "バナナ", "キウイ"];
初期化のあと途中から配列に1つ1つ追加していくこともできます。
//初期化方法③ 空の配列に一つずつ追加
$list = array(); //空の配列
$list[] = "りんご";
$list[] = "みかん";
$list[] = "バナナ";
$list[] = "キウイ";
こちらの方法にもブラケットは使えます。
$list = []; //空の配列
通常の配列の値を取得・確認する
通常配列の値を取得するには配列のリストの番号を指定します。
番号といっても●番目という番号ではありません。
配列の中身には実は内部でインデックスという番号がつけられています。0から1ずつ増えていきます。
0 | りんご |
1 | みかん |
2 | バナナ |
3 | キウイ |
1から始まらないので最初は混乱しますが、ほとんどのプログラミング言語で共通の仕様なので慣れるしかありません。
echo $list[0] . PHP_EOL; //りんごと出力
echo $list[1] . PHP_EOL; //みかんと出力
echo $list[2] . PHP_EOL; //バナナと出力
echo $list[3] . PHP_EOL; //キウイと出力
②連想配列(ハッシュ)
PHPの配列には通常の配列ともうひとつ、連想配列というものがあります。
連想配列の初期化(宣言)
PHPの連想配列はハッシュ値(キー名と値の組み合わせ)を複数いれることができます。
イメージは以下のような感じです。
りんご | 200(円) |
みかん | 50(円) |
バナナ | 100(円) |
キウイ | 150(円) |
左がキー、右が値です。
これを連想配列として初期化(宣言)するには以下のようにします。
$hash = array(
"りんご" => 200,
"みかん" => 50,
"バナナ" => 100,
"キウイ" => 150
);
この場合もarray()の部分はPHP5.4以降であればブラケットを使った[]も使えます。
気づいた方もいるかもしれませんが、連想配列は通常の配列の構成と実はかわりません。0,1,2…と整数だったインデックスが文字列になっただけです。
通常の配列はインデックスが連想配列でいうキーだったのです。
整数の連番のキーで保存するか、文字列のキー名前をつけて保存するかの違いなのです。
また、通常の配列同様に途中から追加するには以下のようにします。
$hash = array();
$hash["りんご"] = 200;
$hash["みかん"] = 50;
$hash["バナナ"] = 100;
$hash["キウイ"] = 150;
連想配列の値を取得・確認する
連想配列の中の値を取得するにはキーを指定します。
echo $hash["りんご"] . PHP_EOL; //200と出力
echo $hash["みかん"] . PHP_EOL; //50と出力
echo $hash["バナナ"] . PHP_EOL; //100と出力
echo $hash["キウイ"] . PHP_EOL; //150と出力
連想配列のルール
重複したキーは上書きされる
連想配列は同じキー名は持てません。
同じキーを持つ値が代入されると上書きされます。
これは通常配列のインデックスも同じです。
$hash = array();
$hash["キウイ"] = 150;
echo $hash["キウイ"] . PHP_EOL; //150と出力
$hash["キウイ"] = 999; //150→999に上書き
echo $hash["キウイ"] . PHP_EOL; //999と出力
キーは整数値か文字列だけ
連想配列のキーには整数か文字列しか指定できません。
浮動小数点である2.1を入れても2に変換されたり、nullを入れても空文字に変換されたりという挙動をしてしまうので、自動変換に頼らず格納時にしっかりと意識して整数か文字列を明示的に使うよう管理しましょう。
値にはどんな型でも格納できる
キー名は整数か文字列しか格納できませんが、値はどんな型でも格納できます。配列の中に配列、オブジェクト型なども格納可能です。
多次元配列
配列の値はどんなデータ型でも格納することができます。
配列の中に配列を格納したものを多次元配列と呼びます。
一見難しそうですが、実際はかなり使う機会が多いテクニックです。
多次元配列のケース① データベースのレコードやCSVなどのように使う
エクセルの表やデータベースのレコード、CSVファイルなんかもPHPの配列によみこんで使ったりなどのケースで多次元配列を使うケースが多いかもしれません。
# | 果物の名前 | 価格 | 個数 |
0 | りんご | 200 | 2 |
1 | みかん | 50 | 10 |
2 | バナナ | 100 | 1 |
3 | キウイ | 150 | 5 |
多次元配列で表現してみましょう。
$hash = array(
array(
"name" => "りんご",
"price" => 200,
"num" => 2,
),
array(
"name" => "みかん",
"price" => 50,
"num" => 10,
),
array(
"name" => "バナナ",
"price" => 100,
"num" => 1,
),
array(
"name" => "キウイ",
"price" => 150,
"num" => 5,
),
);
上記の例は、通常配列の中に連想配列が入れ子になっている多次元配列です。
多次元配列のケース② xmlやjsonなどの構造の相互変換
また、xmlやhtml、jsonなどのような階層構造を持つデータも多次元配列で表現することもできます。
まずこの住所の階層
東京都
渋谷区
恵比寿
宇田川町
新宿区
歌舞伎町
西新宿
この階層をPHPの多次元配列にしてみます。
$hash = array(
"東京都" => array(
"渋谷区" => array(
"恵比寿",
"宇田川町",
),
"新宿区" => array(
"歌舞伎町",
"西新宿",
),
),
);
このように多次元配列は工夫次第で様々なデータを管理できるとても便利な機能です。きちんと理解して使いこなせればプログラミング言語の幅も広がることでしょう。
注意したい配列のルール
キーの中の整数と文字列の混在
これはPHPが色々とゆるいために起こってしまう現象ですが、同じ配列のキーの中に整数と文字列が同時に存在できてしまいます。
$hash = array(
1 => "整数",
"A" => "文字",
5 => "整数",
);
余計なバグを避けたり、データ管理のシンプルさの観点からこのようなまぎらわしいデータ管理はできるだけ避けて整数か文字列化に統一しましょう。
文字列のキーを扱う場合は処理をしているうちに”0088″のようなキーが何かのきっかけで整数に変換されてしまうと、いつのまにかこのような配列になってしまいます。
できるだけキー名はアルファベットや記号からはじめるのがよいでしょう。
キーの整数にマイナスはダメ
キーにマイナスの整数。
これも使えてしまうのが悩みどころです。
先ほど同様バグやデータ管理の単純化の観点から避けた方がよいでしょう。
キーを追加するときに配列は自動で最大インデックスの値を検出しますが、マイナスの値は飛ばして0まで進められてしまいます。
$hash = array(
-100 => "マイナス",
);
$hash[] = "追加";
print_r($hash);
出力
Array
(
[-100] => マイナス
[0] => 追加
)
コメント