🗂

配列について(3)二次元配列編

2023/04/12に公開

この記事は、配列について(2)の続編です。

https://zenn.dev/phpbeginners/articles/b83c65267d03bd

二次元配列とは?

二次元配列とは、配列の中に配列を作る入れ子の配列です。

//  初期化
$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. 既に使用済みの変数を使いまわしたい時などです。しかし、変数の使い回しは思いも寄らないトラブルが発生するので、あまりお勧めはしません。[1]
  2. 関数に変数を渡す場合、初期化済みの配列を渡さないとエラーになる場合があります。

連想配列から、キー名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言語で文字列を扱うサンプルのソースコード
https://paiza.io/projects/tLhc5R28sJl3XMbIQAtQpw

だからPHPでも、文字列中の任意の1文字を指定する方法は、配列と同じなんですね。

$str = 'abc';
echo $str[0]; // a
脚注
  1. 一時的な配列として、$tempなどを使うことはあります。それでもトラブルになることはよくあります。 ↩︎

Discussion