PHPにおける配列操作のまとめ

PHPでの配列の基本

配列とは?

配列とは、PHPにおいて通常、変数は値を1つしか持てません
変数に値を追加しようとした場合、その変数の値は上書きされてしまいます

しかし配列の場合、変数の中にいくつもの値を持つ事ができます

$hairetu = array();

これで $hairetuは 配列であると宣言しました
いちいち宣言しなくても、直接値を入れる事ができます

$hairetu = array('りんご','みかん','オレンジ');

上の例では $hairetu[0]にりんご、$hairetu[1]にみかん、$hairetu[2]にオレンジがはいります

値の追加

では、上の$hairetuに値を1つ追加したいと思います

$hairetu = array('りんご','みかん','オレンジ');
$hairetu[3] = 'メロン';

配列の要素の数をカウントする (count()関数)
count()関数 (配列内に値がいくつあるのかカウントする)
count()関数で配列内の値の数を数える例
$hairetu = array('赤','青','黄','緑','桃');
$count = count($hairetu);
echo $count;
結果 5

配列の値を取り出す (array_slice()関数)
array_slice()関数 - 配列内の値を1部取り出す
array_sliceで配列の1部を取り出す例
//配列の2番目($hairetu[1])から 3つ取り出します
$hairetu = array('悟空','ベジータ','トランクス','クリリン');
$result = array_slice($hairetu,1,3);
var_dump($result);
結果 
array(3) {
  [0]=>
  string(12) "ベジータ"
  [1]=>
  string(15) "トランクス"
  [2]=>
  string(12) "クリリン"
}
配列の後ろ2番目から最後までを取り出す例
$hairetu2 = array('たぬき','きつね','オオカミ','ペンギン');
$result2 = array_slice($hairetu2,-2);
結果 
array(2) {
  [0]=>
  string(12) "オオカミ"
  [1]=>
  string(12) "ペンギン"
}


配列操作 いろいろな値の追加方法(PHP)
array_push()関数 (配列の最後に1つ以上の値を追加する)
array_push()関数で配列の最後尾に値を2つ追加する例
$hairetu = array('りんご','みかん');
array_push($hairetu, 'メロン', 'バナナ');//配列の最後に「メロン」、「バナナ」を追加
結果 ('りんご','みかん','メロン','バナナ')

array_unshift()関数 (配列の先頭に値を1つ以上追加する)
array_unshift()関数で配列の先頭に値を2つ追加する例
$hairetu = array('りんご','みかん','メロン');
array_unshift($hairetu,'パイナップル','マンゴー');
結果 ('パイナップル','マンゴー','りんご','みかん','メロン')

array_splice()関数 (指定位置(配列の途中)に値を追加する)

使い方 array_splice(操作する配列,挿入する位置,削除する数,'代入する値')

array_splice()関数で配列の途中に値を追加する例
$hairetu = array('東京','大阪','福岡');
//第2引数は挿入する位置、第3引数は削除する数 (0は削除しない=1つづつずれる)
array_splice($hairetu,2,0,'北海道');//2は$hairetu[2]に・・ 0は削除しないという事
結果 ('東京','大阪','北海道','福岡')

array_splice()関数は、置換や削除もできます
arry_splice()関数で値を置換する
array_splice()関数で値を1つ置換する例
$hairetu = array('東京','大阪','福岡');
//第2引数は挿入する位置、第3引数は削除する数 (1を指定すると1つ削除) つまりは置換
array_splice($hairetu,1,1,'青森');//1は$hairetu[1]に・・ 1は1つ削除する
結果 ('東京','青森','福岡')
arry_splice()関数で値を削除する
array_splice()関数で配列途中の値を2つ削除する例
$hairetu = array('犬','ねこ','ぱんだ','サル');
//第2引数は挿入する位置、第3引数は削除する数 (2を指定すると2つ削除)
//第4引数を指定しないので何も追加しない つまりは削除だけ
array_splice($hairetu,1,2);//1は$hairetu[1]以降の値を2つ削除
結果 ('犬','サル')

配列の中に値があるか調べる (in_array)
in_array()関数 (配列の中に値が存在するか確認する関数)
使い方 in_array(検索値,調べたい配列名,TRUE); (TRUEをつけると型まであっているか調べる)
in_array()関数を使い、配列の中に値が存在するか?確認する例
$hairetu = array('アメリカ','カナダ','イギリス','日本');
if(in_array('日本',$hairetu,TRUE)){
	echo '配列の中に日本は含まれます';
}else{
	echo '配列の中に日本は含まれていません';
}
結果 配列の中に日本は含まれています

変数が配列なのかを調べる (is_array)
is_array()関数 (配列であるかどうか?を調べる)
is_array()関数の使用例
$tadano_mojiretu = 'おはようございます、今日も良いお天気ですね?';
if(is_array($tadano_mojiretu)){
	echo '配列変数です';
}else{
	echo '配列ではありません';
}
結果 
配列ではありません

配列の値が何番目に出現するかを調べる
array_search関数() (配列の中で検索したい値が何番目に出現するのか調べる関数)
使い方 array_search(検索値,調べたい配列名);
array_search()関数を使い、値が何番目に出現するのかを調べる例
//array_search()は 0から始まります
$hairetu = array('海','山','川');
echo array_search('川',$hairetu);
結果 2

配列の値の削除

上で紹介した、array_splice()関数で削除できますが、他にもあるのでメモしときます

unset()関数 (配列の値を削除する)
unset()関数で簡単に値を削除する例
//出来すぎくんを削除したくて、出来すぎくんが何番目に出現するのかわかっている場合
$hairetu = array('出来すぎくん','のび太君','しずかちゃん');
unset($hairetu[0]);
var_dump($hairetu);
結果
array(2) { 
[1]=> string(12) "のび太君" 
[2]=> string(18) "しずかちゃん" 
}
array_search()とarray_splice()を組み合わせて、特定の値を削除
array_search()とarray_splice()を組み合わせて、特定の値を削除する例
//カメラを削除したいけど、カメラが何番目に出現するかわからない場合
$hairetu = array('パソコン','カメラ','携帯電話','テレビ','エアコン');
$cnt = array_search('カメラ',$hairetu);//$hairetu[0]がパソコンなので、$cntには 1 が入る
array_splice($hairetu,$cnt,1);//$hairetuの中から$cnt番目の値を1つ削除
var_dump($hairetu);
結果
array(4) { 
[0]=> string(12) "パソコン" 
[1]=> string(12) "携帯電話" 
[2]=> string(9) "テレビ" 
[3]=> string(12) "エアコン"  
}
みごとに 「カメラ」 だけを 削除をすることに成功しました
array_unique()関数 (配列内で重複している値を削除する)
array_unique()関数で重複している値を削除する例
$hairetu = array('お父さん','お母さん','おじいちゃん','お父さん');
array_unique($hairetu);//重複した値を削除
結果 ('お父さん','お母さん','おじいちゃん')
array_diff()をつかって、配列の中の空要素だけを取り除く
array_diff()を使い、配列の中の空要素だけを削除する例
//$hairetuには 何も値がない空要素がいくつか混じっています
$hairetu = array("スカート","","ズボン","シャツ","","ネクタイ");
//まずは、この配列がどうなっているのか?var_dumpしてみます
var_dump($hairetu);
array(6) { [0]=> string(12) "スカート" 
[1]=> string(0) "" 
[2]=> string(9) "ズボン" 
[3]=> string(9) "シャツ" 
[4]=> string(0) "" 
[5]=> string(12) "ネクタイ" 
}//やっぱり、空要素もちゃっかりカウントされています
//ここから空要素だけを省くプログラム
$new_hairetu =array_diff($hairetu, array( "" ) );
var_dump($new_hairetu);
結果
array(4) { 
[0]=> string(12) "スカート" 
[2]=> string(9) "ズボン" 
[3]=> string(9) "シャツ" 
[5]=> string(12) "ネクタイ" 
}

array_diff()についての追加説明

array_diffは 今回は削除というプログラムに使用しましたが
本来は 配列と配列を比較して、どちらにも存在しない値を返す関数です

上で使用した例では、$hairetu と array( "" ) を 比較し
$new_hairetuに、空要素が混じっていない部分だけが返って来た訳です
array_diff()の詳しい使い方は 下記でもう一度説明します

2つの配列の値を比較する(array_diff)
array_diff()関数で2つの配列を比較して重複していない値を探す
array_diff()関数の使い方
$hairetu1 = array('海','山','川','空');
$hairetu2 = array('海','空');
$result = array_diff($hairetu1, $hairetu2);
var_dump($result);
結果
array(2) {
 [1]=> string(3) "山" 
 [2]=> string(3) "川" 
 }

配列をつなげて1つの文字列に変換する (implode)
implode()関数 (配列の値を指定した文字でつなげる)
implode()関数で配列を指定した文字で結合し文字列を作成する例
$hairetu = array('アイスクリーム','プリン','シュークリーム');
$tabetai = implode('と',$hairetu);
echo $tabetai.'が食べたい';
結果 アイスクリームとプリンとシュークリームが食べたい

文字列を分解して配列に格納したい(explode)
explode()関数 (特定の文字で区切り配列に格納する)
explode()関数で文字列を分解し配列に格納する例
$youbi = '月曜日,火曜日,水曜日,木曜日,金曜日,土曜日,日曜日';
$bunkai_youbi = explode(',',$youbi);
var_dump($bunkai_youbi);
結果 
array(7) {
 [0]=> string(9) "月曜日" 
 [1]=> string(9) "火曜日" 
 [2]=> string(9) "水曜日" 
 [3]=> string(9) "木曜日" 
 [4]=> string(9) "金曜日" 
 [5]=> string(9) "土曜日" 
 [6]=> string(9) "日曜日" 
 }

文字列を1文字づつ分解して配列に入れたい (str_split)
str_split()関数 (1文字づつ分解して配列に格納する)
str_split()関数で文字列を分解し配列に格納する例
//str_split()はシングルバイトしか分割できません
$str = 'abc';
$str2 = str_split($str);
var_dump($str2);
結果
array(3) { 
[0]=> string(1) "a" 
[1]=> string(1) "b" 
[2]=> string(1) "c" 
}
str_split($str,2);
などとすると2文字づつ分解できますがマルチバイトは2としても分解できません!!


では、マルチバイトを1文字づつ分解する場合はどうすればよいか?
//まず文字列が何文字なのか?カウントします
$str = 'こんにちは';
$cnt = mb_strlen($str,'UTF-8');//必ず文字コード指定して下さい
for($i=0;$i<$cnt;$i++){
$bunkai[] = mb_substr($str,$i,1,'UTF-8');//1文字づつ分解して配列に格納
}
var_dump($bunkai);
array(5) {
  [0]=>
  string(3) "こ"
  [1]=>
  string(3) "ん"
  [2]=>
  string(3) "に"
  [3]=>
  string(3) "ち"
  [4]=>
  string(3) "は"
}

配列の値を合計する(array_sum)
array_sum()関数 (配列の値を合計する)
array_sum()関数で配列の値を合計する例
$int = array(1,10,100,1000);
echo array_sum($int);
結果 1111

配列の値すべてに処理を施す(array_map)
array_map()関数 (配列の値すべてに対して処理を行う)
array_map()関数で配列の値すべてに処理をする例
//すべての名前に 様をつけます
function sama($str){//様をつける ユーザー関数を定義
	return $str.'様';
}
$name = array('田中','山本','佐藤','高橋');
$keisyou = array_map("sama",$name);
var_dump($keisyou);
結果
 array(4) { 
 [0]=> string(9) "田中様" 
 [1]=> string(9) "山本様" 
 [2]=> string(9) "佐藤様" 
 [3]=> string(9) "高橋様" 
 }
成功wwwwwww

array_map()を使用して配列の値すべてにhtmlspecialcharsを施す(エスケープする)
配列の値すべてに一気に htmlspecialcharsを施したい(エスケープ)
配列の値全部にまとめてhtmlspecialcharsをかけるユーザー関数
//通常、配列にはhtmlspecialcharsはまとめてかけれないので関数を作成
function all_h($string) {
    if (is_array($string) === true) {   
        return array_map("all_h", $string);
    } else {
        return htmlspecialchars($string, ENT_QUOTES,'UTF-8');
    }
}
//ここまで
$tag = array('<b>こんにちは</b>','<del>さようなら</del>');
$escape = all_h($tag);
var_dump($escape);
結果
array(2) {
  [0]=>
  string(34) "<b>こんにちは</b>"
  [1]=>
  string(38) "<del>さようなら</del>"
}
わかりにくいですが成功してますwww

配列の数だけ繰り返して処理したい (foreach)
foreach関数 (配列の数だけ繰り返す[ループ処理])
foreach関数で繰り返しループ処理する例
$cup = array('A','B','C','D');
//配列の中に値が4つあるので4回ループ
foreach($cup as $key => $val){//$keyは添え字 [0]~[3]のこと $valは 配列の値('A','B','C','D')
$bust[] = $val.'カップ';
}
var_dump($bust);
結果
array(4) { 
[0]=> string(10) "Aカップ" 
[1]=> string(10) "Bカップ" 
[2]=> string(10) "Cカップ" 
[3]=> string(10) "Dカップ" 
}
foreach関数で繰り返しループ処理する例2
$teikyuubi = array(5,6,7);
foreach($teikyuubi as $key =>$val){
switch($teikyuubi[$key]){
		case 0 : $oyasumi[]='月曜';
	break;
		case 1 : $oyasumi[]='火曜';
	break; 
		case 2 : $oyasumi[]='水曜';
	break; 
		case 3 : $oyasumi[]='木曜';
	break;
		case 4 : $oyasumi[]='金曜';
	break;
		case 5 : $oyasumi[]='土曜';
	break;
		case 6 : $oyasumi[]='日曜';
	break;
		case 7 : $oyasumi[]='祝日';
	break;
	}
}
$message = implode('、',$oyasumi).'は定休日となっております';
}
echo $message;
結果 土曜、日曜、祝日は定休日となっております

配列の値をPOST(GET)したい
フォームから配列をPOST(GET)したい
formからPOSTする例1
基本事項 : フォームからPOSTするときは,name部分を配列にします
//フォーム部分
<form action="" method="POST">
<input type="checkbox" name="check[]" value="0">男性 
<input type="checkbox" name="check[]" value="1">女性 
<input type="checkbox" name="check[]" value="2">その他
<input type="submit" name="submit" value="登録">
</form>
//受け取り部分
if($_POST['submit']){
	$seibetu = $_POST['check'];
}
フォーム部分のname部分を配列にしとけば、受け取り時は自動的にに配列になります!
注意することは、配列はまとめてエスケープできないので上記のまとめてエスケープする関数を使います
(ここではエスケープしてません)

foreachで作成した配列の値をPOST(GET)したい
フォームからforeachで作成した<input type="hidden">をPOSTする
ショッピングカートなどで使うテクニックです
//フォーム部分
<form action="http://ssl.com/ssl.php" method="POST">
<?php
foreach ($_SESSION["cart"] as $key => $val){ ?>
<input type="hidden" name="cart[<?php echo $key; ?>]" value="<?php echo $val; ?>" />
<?php 
}
?>
<input type="submit" name="kounyuu" value="購入する">
</form>