ビボロク。どこかで誰かのためになるWebのTIPS・ノウハウ。備忘録として残しておきます
   
           

なんとなく理解している配列を真面目に再勉強する

  • 投稿日/更新日
  1. home
  2. php

さまざまな言語で配列は使いますが、いつも適当に使っていませんか? 私のことです。検索すると痒いところに手が届かない解説も多く、探している機能が全く書いていないことも、ドキュメント見れば早かったりするものの、最近ではまともに検索に引っかからないこともあります。ということで自分なりにまとめてみました。ちなみにWodpress再勉強のため言語はPHPとしていますが、考え方は他の言語にも通じるところはあると思います。PHPは初心者レベルです。

変数と配列

変数とはなんでしょうか。ここでは変数をお弁当箱にたとえてみます。このお弁当箱には常に一つの物しか入りません。このとき、お弁当を「変数」、入っているおにぎりを「値」と言い、次のように表します。

$obento = "おにぎり"

多くの言語では、変数にはドル記号に続く変数名で表します。この変数名には一定のルールがありますが、「使える文字はa-z、A-Z、数字である」「数字から始めない」ことだけ覚えておけばとりあえず良いかと思います。(ドキュメントはこちら)。プログラムではありませんが、CSSもID名やCLASS名は数字から始めてはいけませんね。

配列も変数の一種です。配列はひとつのグループのためここではお重で例えてみましたが、やはりこれも一つの段には一つの物しか入りません。このお重と入っているドーナッツ、そして横に書いているkeyの関係は次のように幾つかの書き方で表せられます。

// 配列
$ozyu=array("プレーンドーナッツ","チョコチップドーナッツ","フレンチクルーラー");

// 配列の短縮構文
$ozyu= ["プレーンドーナッツ","チョコチップドーナッツ","フレンチクルーラー"];

//連想配列
$ozyu= [
  "下段" => "プレーンドーナッツ",
 "真ん中" => "チョコチップドーナッツ",
 "最上段" => "フレンチクルーラー",
];

なぜこんなにいろんな書き方あるのか? 最後の連想配列だけ名前がついているのはなぜか? =>はなんなのか? などいろんな疑問が湧いてくると思います。それを整理しながら理解していきましょう。

新規で配列の箱を作る

新規で配列の箱を作る(宣言と言ったり初期化と言ったりします)には下記のように記述します。

$new_array = array();

array()は配列を作る関数です。この関数は下記のような書き方で省略することができます。これを短縮構文と言いますが、どちらもまったく同じ意味になります。短縮構文は角括弧(大括弧)になっていることに注意です。

//配列の短縮構文
$new_array=[];

配列に初期値を設定する

配列にはkey => valueの形式で格納することが出来ます。keyはキーと呼び、配列から呼び出す時の目印になります。valueは値のことで、あらゆるデータが入ります。この矢印 =>(イコール大なり記号)はアロー関数と言います。データの格納は下のように記述します。

$new_array = array(
 "青" => "blue",
 "赤" => "red",
);

// 配列の短縮構文
$new_array = [
  "青" => "blue",
 "赤" => "red",
];

複数の配列を作成する場合は後ろにカンマで区切ります。一番最後のカンマ(上記例ではredの後ろ)はあってもなくてもかまいません。このカンマがあっても配列としてカウントはされません。

keyはオプションで省略が可能です。なので一般的には下記のような記述を目にすることが多いでしょう。

$new_array = array("blue","red");

// 配列の短縮構文でkeyを省略
$new_array = ["blue","red"];

あくまでもkeyは省略されているということをきちんと認識しておくことが大事です。

keyを省略すると何が起こる?

Keyを省略した場合は、その時のkeyの最大の番号が何かによって挙動が違ってきます。上記例の場合は新しい配列なので、blueのkeyは「0」、redのkeyは「1」が振られます。

$new_array = array("blue","red");


//上記keyを省略すると、下記のような記述と同一となる
$new_array = array(
 "0" => "blue",
 "1" => "red",
);

もし別途で「黄色」の値を追加した場合は「2」になるでしょう。ただしこれらは常に連番というわけではなく、配列の操作などによって番号が飛んだり、順番が変わることもあるでしょう。keyはあくまでも配列内をユニークに認識させるための添字と考えたほうが良いでしょう。

keyは省略せずに記述したほうが後々の管理がしやすいこともあると思いますし、単純な配列などは無い方がソースがスッキリすることもあります。int型の数値のほうがメモリが少なくて済むという話も聞きますが、お好みで選択するとよいと思います。

配列の中身の確認方法

配列の中身を確認するときは、おもにprint_r関数を用います。

$new_array = ["blue","red"];

print_r($new_array);

//結果
Array
(
    [0] => blue
    [1] => red
)

同様の関数としてvar_dump、var_exportというのもあります。

var_dump($new_array);

//出力結果
array(2) {
  [0]=>
  string(3) "blue"
  [1]=>
  string(3) "red"
}

//出力結果の説明
array(格納されている配列の数) {
  [key]=>
  型(バイト数) "値"
}

このように出力される情報はvar_dumpのほうが詳しいので、型やバイト数を調べたい場合に使いますが、通常はprint_rで良いかと思います。このように配列を操作したときは適時中身を確認していきます。

配列の箱に値を追加

最初に配列の空箱を作っておいて、のちのちの処理で配列に値を追加していくことは往々にしてあります。その場合は下記のように記述します。

$new_array = [];
$new_array[0]="yellow";
$new_array[1]="purple";

print_r($new_array);

//結果
Array
(
    [0] => yellow
    [1] => purple
)

上記例では大括弧[]の中にわざわざkeyを記述していますが、上で述べたようにkeyは自動的に割り振られて追加されます。つまり次の記述も同じ結果になります。

$new_array = [];
$new_array[]="yellow";
$new_array[]="purple";

これらの方法では一回につき一つの配列しか登録できません。

まとめて追加する場合

複数を一度に登録したい場合はarray_pushを使います。

$new_array = [];
array_push($new_array , "yellow", "purple");

アンパック

配列変数の前にドットを3つ...を付けることで、配列の内容を展開できます。一般的にはスプレッド構文とも呼ばれているものです。

$arr1=["red","blue"];
$arr2=[...$arr1]; //[red,blue]
$arr3=["yellow",...$arr1,"purple"]; //[yellow,red,blue,purple]

アンパックの動作は、PHP7系と8系とで動作が違うようで、8系のほうが便利になっているようです。若干話はそれますが、アンパックを使うと配列を用いて下記のようなことも可能です。

$tag=["<h1>","タイトル","</h1>"];

function outputHTML(...$params) {
    echo $params[0].$params[1].$params[2];
}
  
outputHTML(...$tag);

//出力
<h1>タイトル</h1>

array_merge()関数

アンパックと同じように配列を結合できますが、配列同士である必要があります。個人的にはアンパックのほうが扱いやすいと思います。

$result = array_merge($array1, $array2);

配列の値の呼び出し方

$new_array = ["blue","red"];
echo $new_array[0];

//出力結果
blue

これまでの説明通り、keyが省略されているので、0からの番号が振られているはずです。blueを呼び出すには、0を指定すれば良いことになります。

$new_array=[
"青" => "blue",
"赤" => "red",
];

echo $new_array['青'];

//出力結果
blue

連想配列の場合はkeyで指定します。

いったんここまで。多次元配列は別の機会に。

                   

備忘録として残しておきます。                    

関連記事