PHPにおける配列(array)の便利な取り扱い方法

PHPは10年仕事で使っています。
PG、SE、PMとして、PHPのプロジェクトに関わりました。
ただ、もともと専門教育受けていなかったので、修得するのが大変でした。
なので初学者に向けて、PHPの配列を覚えるコツを書いて行こうと思います。

PHPにおける配列とは何か

配列とは何かというと、「箱」とか「タンス」と専門書で説明されていたりします。
1個の配列名に対して、沢山データをしまえるので、このように形容されます。
プログラムで表現すると、下記のようになります。

<?php

$箱 = [];
$箱[] = '人形';
$箱[] = 'プラレール';
$箱[] = 'トミカ';

var_dump($箱);

$タンス = [];
$タンス[] = '春物';
$タンス[] = '夏物';
$タンス[] = '秋物';
$タンス[] = '冬物';

var_dump($タンス);

プログラムで表した箱をテーブルで表現すると下記のようになります。

配列名キー(Index)名
0人形
1プラレール
2トミカ

なるほど、タンスに似てますね。
配列名にキー名を付けるので、同じ名前なのに、
別の値を保持することができるということですね。
キー名を数値でなく、名前で付けることもできます。
この場合は、連想配列と呼び方が変わります。
ここではキー名と言っていますが、indexや添え字と呼ばれたりします。
配列の中に配列を持つ多次元配列という配列もありますが、
本記事では、最も基本的な配列に焦点を当てて説明していきます。
順を追って理解して行った方が学習効率が良いので、
配列から説明をしようと思いました。

定義方法が分かったところで、利用場面を確認していきます。

PHPで配列が使えるとどんな時に役に立つのか

配列は配列名1個に対してデータを沢山保持できると分かっても、配列をどのように扱っていいのかがイメージができませんでした。配列を知っていると、何が便利なのか書いて行こうと思います。

① フォーム部品などの規定値をあらかじめ定義できる

決まった値を、データとして保持しておきたい場合。
HTMLのフォーム部品selectタグを利用する際、optionの値を管理できます。

② データを配列変換する場合

外部とのデータ連携に配列を利用することがよくあります。
取り込むデータで個人的に多いと思うのは下記です。

  • CSVデータ
  • SQL発行時の結果取得
  • APIへの問い合わせ結果

配列を利用するときは配列変換して利用することが多いです。
自分で定義して利用することってあんまりないので、
定義方法勉強しても意味ないと思うかも知れません。
ただ、PHPの配列の定義方法を勉強しておけば、読み解くことはできます。
読み解くことができれば、質問ができるので、業務でも活かせます。
なので、配列定義方法はしっかり覚えておきましょう。

PHPで配列を利用するには

定義、または取得した配列データをどのように利用するのか、下記のように利用する場合が多いです。

  • 配列の並べ替え
  • 配列の切り取り
  • 配列の追加
  • 配列要素の上書き

配列は配列のキーを参照すれば、データにアクセスすることができるので、
アクセスした上で、そのデータをどうすれば良いのか命令(処理)を書けば、制御できます。
ただ、PHPでは、配列を利用し易くする為に、定義済みの関数が用意されています。
利用しない(配列のIndexにアクセス)方が処理速度が速い場合もありますが、
利用した方がメリットもあるので、PHPの配列制御の関数を利用した方法を説明していきます。

配列の並べ替え(ソート)について

並べ替えは昇順か降順で行われます。昇順と降順を古い、新しいで表現すると、認識違いし易いので、昇順と降順は下記の様に自分はイメージしています。

身長測定をイメージしてください
  • 昇順…生まれたのが早い
  • 降順…生まれたのが遅い

つまり、年齢で例えると、若い順が昇順ということになります。

昇順、降順は検索するのが面倒なときであったり、
データの分析をする為に、データを俯瞰して眺めたい時であったり、
利用シーンは多々あるので、ユーザに優しいアプリを作る為に必要です。

PHPの配列の並べ替えする方法を見て行きます。

PHPでの配列の並べ替え(ソート)するには

配列の値を昇順での並べ替えるには、sort関数を利用します。
sort関数に限らず、ソート系の関数を利用するメリットがあります。
それは、複雑なソートプログラムを書かなくていい点です。

<?php

$a = [5,4,3,2,1];
var_dump(sort($a)); // 成功した場合true、失敗した場合falseを返します。
var_dump($a); // $aの中身が[1,2,3,4,5]に代わります。

このプログラムの実行結果は下記です。

 bool(true)
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
} 

期待通り昇順でソートされています。次は降順です。rsortという関数を使います。

<?php

$a = [5,4,3,2,1];
var_dump(sort($a)); // 成功した場合true、失敗した場合falseを返します。
var_dump($a); // $aの中身が[1,2,3,4,5]に代わります。
//$aが[1,2,3,4,5]になっているので、このままrsortします。
var_dump(rsort($a)); //ソートが成功したのでtrueが返ります。
var_dump($a); //$aの中身が[5,4,3,2,1]に戻ります。
bool(true) // sortの結果
array(5) { // sortで順番が入れ替わった配列を出力した結果
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
bool(true)  //rsortの結果
array(5) {  // rsortで順番が入れ替わった配列を出力した結果
  [0]=>
  int(5)
  [1]=>
  int(4)
  [2]=>
  int(3)
  [3]=>
  int(2)
  [4]=>
  int(1)
}

期待通り降順でソートされました。

PHPで配列を切り取るには

PHPでは、配列のデータを切り取って再利用したい場合があります。PHPには配列の切り取り用の関数がいくつか用意されています。配列のデータから直接切り取る(配列を切り取り変数へ移動させる)ので、利用する際は注意してください。元の配列から1つ要素がnullにならず失われます。

切り取る感覚が分からないと思います。
プログラムと実行結果を載せるので、
感覚を掴んでもらいたいと思います。

配列の先頭を切り取る

array_shiftを利用すれば、配列の頭のデータを切り取ることができます。
array_shift等の切り取り系の関数を利用するメリットは、

  • データがあるのかないのか関数で判断できる点
    (配列にデータが無い場合nullが返される)
  • 配列から、データが減っていく点

上記2点だと思っています。ただ、データに直接アクセスした方が処理は少し早くなります。
ループと併用すれば、頭からデータを1個ずつ取得することができます。

<?php

$resource = [1,2,3,4,5];

foreach($resource as $key => $val) {
	$migration[] = array_shift($resource);
}

var_dump($resource); // 配列から値が無くなっている
var_dump($migration); // 値が末尾から移動している
array(0) {
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

このように、配列を先頭から別の配列へ移行させることに成功しました。
次は末尾から移行させる方法をやります。

配列を末尾から取り出す

先ほどは先頭から取り出しましたが、array_popを利用すれば末尾から取り出すこともできます。

<?php

$resource = [1,2,3,4,5];

foreach($resource as $key => $val) {
	$migration[] = array_pop($resource);
}

var_dump($resource); // 配列から値が無くなっている
var_dump($migration); // 値が末尾から移動している

array(0) {
}
array(5) {
  [0]=>
  int(5)
  [1]=>
  int(4)
  [2]=>
  int(3)
  [3]=>
  int(2)
  [4]=>
  int(1)
}

先頭と末尾だけこと足りそうですが、まだ便利な配列の取り出し方法があります。

配列を指定した範囲で取り出す

慣れるまで、なんとなく敬遠しがちですが、範囲指定で配列を取り出す方法もあります。先頭から取り出す、末尾から取り出す場合、元の配列のデータが変わりましたが、配列を指定した範囲で取り出す場合、元の配列のデータは変わりません。

array_sliceを利用するメリットは、配列のデータを自由度高く扱える点にあります。

<?php

$resource = [1,2,3,4,5]; // 配列は0番から始まります。

$output = array_slice($resource,2); // 配列の2番目以降が切り取られる
echo '======== 5行目の結果 ========'.PHP_EOL;
var_dump($output);
var_dump($resource);

$output = array_slice($resource,0,2); // データの0から2番目以降が切り取られる
echo '======== 10行目の結果 ========'.PHP_EOL;
var_dump($output);
var_dump($resource);

$output = array_slice($resource,-2); // データの0から2番目以降が切り取られる
echo '======== 15行目の結果 ========'.PHP_EOL;
var_dump($output);
var_dump($resource);

======== 5行目の結果 ========
array(3) {
  [0]=>
  int(3)
  [1]=>
  int(4)
  [2]=>
  int(5)
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
======== 10行目の結果 ========
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
======== 15行目の結果 ========
array(2) {
  [0]=>
  int(4)
  [1]=>
  int(5)
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

結果について箇条書きで説明します。

  • array_sliceの第二引数には、正と負の数両方が指定できます。
  • 正の数を指定した場合、正の数以降の配列の値のコピーが取得できます。
  • 負の数を指定した場合、配列の末尾からn番目の値のコピーが取得できます。
  • array_sliceの第二、第三引数を指定した場合、
    第二引数と第三引数の範囲の配列の値のコピーが取得できます。

都道府県を表した配列がある時、中部地方とかで抜き出したい時に便利です。

PHPで配列を追加するには

PHPで配列からデータを切り取る方法を先ほどやったのですが、今度は、その逆で配列にデータを追加する方法をやります。メリットとしては、何個配列が入っているかが関数実行時に分かるところです。ただ、こちらも処理自体は、直接配列のキー指定してデータを入れる方が早いです。

配列を先頭から追加する

PHPのarray_unshift関数を使うと、配列の先頭からデータを追加することができます。

<?php

$resouce = [1,2,3,4,5]; // 配列の数は01234個
$unshift = array_unshift($resouce,-1,0); //1の前に、-1と0が追加されて配列の数が6個になる。
var_dump($unshift);
var_dump($resouce);
int(7)
array(7) {
  [0]=>
  int(-1)
  [1]=>
  int(0)
  [2]=>
  int(1)
  [3]=>
  int(2)
  [4]=>
  int(3)
  [5]=>
  int(4)
  [6]=>
  int(5)
}

array_unshiftは、配列を1から数えるので7になります。そして、元の配列には、追加されたデータが入って配列の数は6つと、想定通りの結果となりました。

配列を末尾から追加する

array_pushは、array_unshiftとは逆に配列の末尾からデータを追加することができます。

<?php

$resouce = [1,2,3,4,5]; // 配列の数は01234個
$push = array_push($resouce,6,7); //5のあとに、6と7が追加されて配列の数が6個になる。
var_dump($push); // 1から配列の数を数えた結果を返すので7
var_dump($resouce);

int(7)
array(7) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
}

array_pushも配列を1から数えるので7になります。結果を見ると、末尾にデータが追加されているのが分かります。

PHPで配列データ上書き

任意の配列に対して、データを再度入力すれば上書きされますが、これも関数が用意されています。これを利用するメリットは、データを上書きしたい配列が複数でも行えることです。

複数の配列データを上書きする

array_sliceと名前の似ているarray_spliceという関数を使います。上書きするという表現で抽象化(はしょる)していますが、厳密には、配列の要素を削除して任意の要素で置換するということをしています。

<?php

$resouce = [1,2,3,4,5];
$splice = array_splice($resouce,1,2,[22,33]); //1番目の2と2番目の3を変更します。
var_dump($splice);
var_dump($resouce);

array(2) {
  [0]=>
  int(2)
  [1]=>
  int(3)
}
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(22)
  [2]=>
  int(33)
  [3]=>
  int(4)
  [4]=>
  int(5)
}

array_spliceの返り値は配列から削除した値になるので、返り値を変数に入れておけば、削除した値を覚えておけるので便利ですね。

配列の場所を指定して追加

PHPで配列を追加の場所で説明するのが適切なのですが、array_spliceは削除、追加、上書きができる他のと違う関数なのと、ここでは応用的なことをやるので、他のを見て感覚を掴んでから見て欲しかったという理由で、こちらで説明することにしました。

上記のようなイメージでやります。

やり方はarray_spliceの第二引数の範囲を基準から0にします。
某CMの曲でサンプルプログラム作りたいと思います。

<?php

$from = 2;
$to = 0;

$higasimaru1 = ['きつね','たぬき','おにく'];
$higasimaru2 = ['てんぷら','つきみ'];

array_splice($higasimaru1,$from,$to,$higasimaru2);
var_dump('配列の合体成功',$higasimaru1);
$higasimaru3 = ['ひ●しまる','うどん','うどん','うどん','スープ'];
$higasimaru1 = array_merge($higasimaru1,$higasimaru3);
var_dump('配列を結合して歌詞を含んだ配列を作成',$higasimaru1);
string(21) "配列の合体成功"
array(5) {
  [0]=>
  string(9) "きつね"
  [1]=>
  string(9) "たぬき"
  [2]=>
  string(12) "てんぷら"
  [3]=>
  string(9) "つきみ"
  [4]=>
  string(9) "おにく"
}
string(54) "配列を結合して歌詞を含んだ配列を作成"
array(10) {
  [0]=>
  string(9) "きつね"
  [1]=>
  string(9) "たぬき"
  [2]=>
  string(12) "てんぷら"
  [3]=>
  string(9) "つきみ"
  [4]=>
  string(9) "おにく"
  [5]=>
  string(15) "ひ●しまる"
  [6]=>
  string(9) "うどん"
  [7]=>
  string(9) "うどん"
  [8]=>
  string(9) "うどん"
  [9]=>
  string(9) "スープ"
}

「たぬき」の後に、「てんぷら」と「つきみ」が追加されました。 これ知った時は、プチ感動があったんですが、皆さんはどうでしょうか。

後半で、array_mergeという関数を利用しています。これは配列同士を結合する際に利用する関数になります。歌詞を完成させたいという思いで利用しました。

あなた
項目の末尾にhigasimaru3突っ込めばいいんじゃないですか?

すごいですね。鋭い指摘です。ここまで読んでいただいてありがとうございます。ただ、例えばarray_pushで突っ込むと、5個目の配列にhigasimaru3 の配列が突っ込まれるという状態になるのを回避しました。

…横着はいけないと思うので、結果をお見せしたいと思います。

array(6) {
  [0]=>
  string(9) "きつね"
  [1]=>
  string(9) "たぬき"
  [2]=>
  string(12) "てんぷら"
  [3]=>
  string(9) "つきみ"
  [4]=>
  string(9) "おにく"
  [5]=>
  array(5) {
    [0]=>
    string(15) "ひ●しまる"
    [1]=>
    string(9) "うどん"
    [2]=>
    string(9) "うどん"
    [3]=>
    string(9) "うどん"
    [4]=>
    string(9) "スープ"
  }
}

と、このような結果になってしまうのを避けたかったんですよ。配列を結合したい場合。つまり、配列の末尾から配列要素を追加したい場合にはarray_mergeを利用しましょう。

PHPの配列は他にもある

ここまで読んでくれた方、本当にありがとうございます。エンジニアになりたい方は、頭からここまで読んだのであれば、分かりにくい記事からでもヒントを得ようと読む忍耐力や好奇心があるのできっと良いエンジニアになれると思います。この記事のコードはphp5.4以降の配列の表記方法で書かれているので、昔過ぎるphpだと動かないので注意してください。

ただすみません、今回は「配列」にフォーカスしました。

実践想定するのであれば、キー名が英名でかつ、キーの中に値ではなく配列が入っている、多次元連想配列にフォーカスすべきですが、配列の基本を押さえておけば、多次元連想配列の理解も早いのでこちらから記事を書くことにしました。

連想配列、多次元連想配列と名前ばかり出てきてますが、どんなものかまだ書いていないので、いくつか表現してみようとおもいます。ありそうな、フォームからの投稿データと、APIから帰ってきそうなデータを作ってみました。

<?php

$postData = [
	'name' => '宇治山田茂雄',
	'gender' => '男',
	'age' => '15',
	'comment' => '今日は良い日だった。'
];

var_dump($postData);

$prefData = [
	'jp_area1' => [
		'name' => '東北地方',
		'area1_list' => [
			'青森県',
			'秋田県',
			'岩手県',
			'新潟県',
			'福島県',
			'宮城県',
			'山形県',
		]
	],
];

var_dump($prefData);
array(4) {
  ["name"]=>
  string(18) "宇治山田茂雄"
  ["gender"]=>
  string(3) "男"
  ["age"]=>
  string(2) "15"
  ["comment"]=>
  string(30) "今日は良い日だった。"
}

array(1) {
  ["jp_area1"]=>
  array(2) {
    ["name"]=>
    string(12) "東北地方"
    ["area1_list"]=>
    array(7) {
      [0]=>
      string(9) "青森県"
      [1]=>
      string(9) "秋田県"
      [2]=>
      string(9) "岩手県"
      [3]=>
      string(9) "新潟県"
      [4]=>
      string(9) "福島県"
      [5]=>
      string(9) "宮城県"
      [6]=>
      string(9) "山形県"
    }
  }
}

多分、こんな感じのデータをなんとかすることが実践では多いと思います。キーが意味のある言葉に変わろうが、次元がいくつ増えようが、自分が戦える形に持っていけば問題に打ち勝つことができます。とはいえ、また機会があれば、多次元連想配列もやっていきたいと思いますので、よろしければフォローお願いします。

プログラムの勉強は、挫折し易いです。私も覚える必要を自覚するまでは、参考書などを買って勉強していた時期もありますが、覚えられなかったです。簡単なサンプルプログラムを写して動いて喜んでいたくらいでした。中身を全く理解していないのに。

私はデザイナー時代に

  • 会社から自立したかった
  • 同年代にあこがれのプログラマーがいた
  • 手を出せば案件を引き受けられる状況になった

この動機付けがあったので、ひたすら巷のプログラムを書き写して実行して、本を読んだり、プロジェクトやったりして、500万くらいまでのプロジェクトを形にできる技術を身に着けました。1000万以上のプロジェクトにも要員として参加した経験を得ることができました。

ただ、基本が無かったので、そこそこのプロジェクトでは複数人作業があったり、品質の担保を求められたりするので、コミュニケーションや品質担保の方法が分からず苦労しました。

TECH::EXPERTなら転職活動のサポートも行っていますし、全額返金保証プログラムもありますし、最低月額3万円という金額で受講できるのでおすすめです。

勉強もそうですが、同じ道を志す仲間に巡り合えることも魅力の一つです。 よろしければスクールも是非検討してみてください!

スポンサーリンク

この記事が気に入ったら
フォローしよう

最新情報をお届けします

おすすめの記事