配列について(3)二次元配列編
この記事は、配列について(2)の続編です。
二次元配列とは?
二次元配列とは、配列の中に配列を作る入れ子の配列です。
// 初期化
$arr = [
'apple' => ['macOS', 'iOS'],
'unix' => ['Linux', 'BSD'],
];
// 配列が入れ子になっている
var_dump($arr);
var_dumpの結果
array(2) {
["apple"]=>
array(2) {
[0]=> string(5) "macOS"
[1]=> string(3) "iOS"
}
["unix"]=>
array(2) {
[0]=> string(5) "Linux"
[1]=> string(3) "BSD"
}
}
二次元配列の変数を読み書きするには、キー名やindex番号を組み合わせます。
// 初期化
$arr = [
'unix' => ['Linux', 'BSD'],
];
// 二次元配列の値を出力する
echo $arr['unix'][0]; // Linux
// 二次元配列に新しい変数を追加する方法
$arr['unix'][] = 'HP-UX';
var_dump($arr['unix']);
var_dumpの結果
array(3) {
[0]=> string(5) "Linux"
[1]=> string(3) "BSD"
[2]=> string(5) "HP-UX"
}
三次元配列はできない?
できます!
$arr = [
'unix' => [
'Linux' => ['Redhat','Debian'],
'BSD' => ['FreeBSD','NetBSD'],
],
];
var_dump($arr);
array(1) {
["unix"]=>
array(2) {
["Linux"]=>
array(2) {
[0]=> string(6) "Redhat"
[1]=> string(6) "Debian"
}
["BSD"]=>
array(2) {
[0]=> string(7) "FreeBSD"
[1]=> string(6) "NetBSD"
}
}
}
四次元配列はできない?
できます!何次元配列だろうと、メモリーが許す限り100次元配列でも1000次元配列でもできます!
$arr = [];
for($i=0; $i<10; $i++){
$arr[0] = $arr;
}
var_dump($arr);
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(1) {
[0]=>
array(0) {
}
}
}
}
}
}
}
}
}
}
}
Q&A
配列の初期化の方法を教えて下さい
// 変数を空の配列で初期化する
$array = array();
// 配列に変数を設定して初期化する
$array = array('a','b','c');
// PHP7.0からは、次の記法が使えます
$array = [];
$array = ['a','b','c'];
array()
の方法と、[]
の方法で、特に違いはありません。好みの問題です。私は[]
が好みです。
配列の初期化は、どんな時に使いますか?
- 既に使用済みの変数を使いまわしたい時などです。しかし、変数の使い回しは思いも寄らないトラブルが発生するので、あまりお勧めはしません。[1]
- 関数に変数を渡す場合、初期化済みの配列を渡さないとエラーになる場合があります。
apple
の配列だけを取り出すには、どうすればいいですか?
連想配列から、キー名キー名を指定して取り出せます。
$array = [
'apple' => ['macOS','iOS'],
'google' => 'android',
'microsoft' => 'windows',
];
var_dump($array['apple']);
appleとmacOSの間に要素の追加はできますか?
例えば、こんな感じです→
'apple' => 'OS' => ['macOS','iOS']
// このような二次元配列の間に、'OS'を追加して、三次元配列にします
$array = [
'apple' => ['macOS','iOS'],
];
// 二次元目の配列を退避する
$temp = $array['apple'];
// 一次元目の配列を空にする(空にしないと重複する)
$array['apple'] = []; // 空の配列で上書き
// 二次元目のキー名を`OS`にして、退避した配列を三次元目として追加する
$array['apple']['OS'] = $temp;
// 結果を確認する
var_dump($array);
頭が混乱して理解できません…
最初はみんなそうです。新しい概念を人間の脳が理解できるようになるには、脳の中に新しい回路が形成される必要がありますが、それにはたくさんの『反復練習』と、『経過時間』が必要です。
たくさん『反復練習』しないと、脳は新しい回路を作りません。
たくさん『反復練習』しても、脳が新しい回路を作るには『時間』が必要です。
ちゃんと栄養を摂って、たくさん寝て下さい。寝ないと脳は記憶を整理しませんし、栄養が足りないと脳は活性化しません。毎日、練習問題をこなしていれば、早ければ1週間、遅くても1ヶ月で理解できるようになってるはずです。
コラム:実は文字列は配列だった!
実は、文字列は配列です。C言語で "文字列" を扱うには、char型(8bit=1byte)の変数を、文字の数だけ配列として確保します。
以下は、C言語的で配列を初期化する方法ですが、PHPの記法とよく似ています。
// C言語で配列を初期化する方法
char str[] = "abc";
charとは、キャラクター(1文字)の型という意味で、英数字1文字しか格納できません。"abc"と3文字を入れたい場合は、3byte分のchar型を繋げた配列を用意する必要があります。
↓C言語で文字列を扱うサンプルのソースコード
だからPHPでも、文字列中の任意の1文字を指定する方法は、配列と同じなんですね。
$str = 'abc';
echo $str[0]; // a
-
一時的な配列として、
$temp
などを使うことはあります。それでもトラブルになることはよくあります。 ↩︎
Discussion