[PHP] array_columnでDB結果セットから特定カラムの配列を作る
array_column
は、DB の検索結果とか多次元配列から、特定のカラムや、特定のカラムの値をキーにした新しい配列を作る関数。あるカラムの値があるかないかとか、あるカラムの値でグループ分けしたり、ページを分けたい時とかに便利。この関数を使ったサンプルも記載。
PHP5.5 から登場し、 PHP7.0 からはオブジェクトの配列も扱える。
Contents
書式
array_column ( array $list , 多様な型 $column_key [, 多様な型 $index_key = NULL ] )
array $list
):多次元配列、またはオブジェクト配列第 2 引数(多様な型
$column_key
):配列の値にしたいカラム。 NULL
を指定すると、配列やオブジェクトを返す第 3 引数(多様な型
$index_key
):配列のキーにしたいカラム。省略可DB データ
こんなデータがあるとする。
+----+--------------------+------------+-----------+
| id | name | birthday | class |
+----+--------------------+------------+-----------+
| 1 | 山田 花子 | 2016-01-01 | はな |
| 2 | 小林 太郎 | 2016-07-19 | もも |
| 3 | 蛇喰 夢子 | 2016-10-21 | はな |
| 4 | 百喰 キラリ | 2016-11-11 | もも |
| 5 | 小林 竜胆 | 2014-01-13 | さくら |
| 6 | 幸平 創真 | 2015-03-13 | ゆり |
| 7 | 薙切 えりな | 2015-02-10 | もも |
| 8 | 薙切 アリス | 2015-02-10 | はな |
| 9 | 司 瑛士 | 2014-04-28 | さくら |
| 10 | 葉山 アキラ | 2015-02-28 | はな |
+----+--------------------+------------+-----------+
連想配列( MYSQLI_ASSOC )の DB 結果セット「$list
」の中身
array(10) {
[0] => array(4) {
["id"] => string(1) "1"
["name"] => string(13) "山田 花子"
["birthday"] => string(10) "2016-01-01"
["class"] => string(6) "はな"
}
[1] => array(4) {
["id"] => string(1) "2"
["name"] => string(13) "小林 太郎"
["birthday"] => string(10) "2016-07-19"
["class"] => string(6) "もも"
}
[2] => array(4) {
["id"] => string(1) "3"
["name"] => string(13) "蛇喰 夢子"
["birthday"] => string(10) "2016-10-21"
["class"] => string(6) "はな"
}
[3] => array(4) {
["id"] => string(1) "4"
["name"] => string(16) "百喰 キラリ"
["birthday"] => string(10) "2016-11-11"
["class"] => string(6) "もも"
}
[4] => array(4) {
["id"] => string(1) "5"
["name"] => string(13) "小林 竜胆"
["birthday"] => string(10) "2014-01-13"
["class"] => string(9) "さくら"
}
[5] => array(4) {
["id"] => string(1) "6"
["name"] => string(13) "幸平 創真"
["birthday"] => string(10) "2015-03-13"
["class"] => string(6) "ゆり"
}
[6] => array(4) {
["id"] => string(1) "7"
["name"] => string(18) "薙切 えりな"
["birthday"] => string(10) "2015-02-10"
["class"] => string(6) "もも"
}
[7] => array(4) {
["id"] => string(1) "8"
["name"] => string(18) "薙切 アリス"
["birthday"] => string(10) "2015-02-10"
["class"] => string(6) "はな"
}
[8] => array(4) {
["id"] => string(1) "9"
["name"] => string(10) "司 瑛士"
["birthday"] => string(10) "2014-04-28"
["class"] => string(9) "さくら"
}
[9] => array(4) {
["id"] => string(2) "10"
["name"] => string(16) "葉山 アキラ"
["birthday"] => string(10) "2015-02-28"
["class"] => string(6) "はな"
}
}
特定カラムの配列を作る
カラム「 birthday 」の配列を作る。
$birthdays = array_column($list, 'birthday');
// カラム「birthday」の配列を作る
$birthdays = array_column($list, 'birthday');
var_dump($birthdays);
array(10) {
[0] => string(10) "2016-01-01"
[1] => string(10) "2016-07-19"
[2] => string(10) "2016-10-21"
[3] => string(10) "2016-11-11"
[4] => string(10) "2014-01-13"
[5] => string(10) "2015-03-13"
[6] => string(10) "2015-02-10"
[7] => string(10) "2015-02-10"
[8] => string(10) "2014-04-28"
[9] => string(10) "2015-02-28"
}
特定カラム 1 がキー、特定カラム 2 が値の配列を作る
カラム「 name 」がキーで、カラム「 birthday 」が値の配列を作る。 キーになるカラムは、第三引数に指定する。
$birthdays = array_column($list, 'birthday', 'name');
// カラム「name」がキー、カラム「birthday」が値の配列を作る
$birthdays = array_column($list, 'birthday', 'name');
var_dump($birthdays);
array(10) {
["山田 花子"] => string(10) "2016-01-01"
["小林 太郎"] => string(10) "2016-07-19"
["蛇喰 夢子"] => string(10) "2016-10-21"
["百喰 キラリ"] => string(10) "2016-11-11"
["小林 竜胆"] => string(10) "2014-01-13"
["幸平 創真"] => string(10) "2015-03-13"
["薙切 えりな"] => string(10) "2015-02-10"
["薙切 アリス"] => string(10) "2015-02-10"
["司 瑛士"] => string(10) "2014-04-28"
["葉山 アキラ"] => string(10) "2015-02-28"
}
// カラム「 class 」をキーにすると重複している値は上書きされる。
$classes = array_column($list, 'birthday', 'class');
var_dump($classes);
array(4) {
["はな"] => string(10) "2015-02-28"
["もも"] => string(10) "2015-02-10"
["さくら"] => string(10) "2014-04-28"
["ゆり"] => string(10) "2015-03-13"
}
特定カラムがキー、行が値の配列を作る
カラム「 name 」をキーにして、行が値となる配列を作る。 キーとなる「 name 」は第三引数に指定する。
$kids = array_column($list, null, 'name');
// カラム「name」をキーにして、行を値にする
$kids = array_column($list, null, 'name');
var_dump($kids);
array(10) {
["山田 花子"] => array(4) {
["id"] => string(1) "1"
["name"] => string(13) "山田 花子"
["birthday"] => string(10) "2016-01-01"
["class"] => string(6) "はな"
}
["小林 太郎"] => array(4) {
["id"] => string(1) "2"
["name"] => string(13) "小林 太郎"
["birthday"] => string(10) "2016-07-19"
["class"] => string(6) "もも"
}
["蛇喰 夢子"] => array(4) {
["id"] => string(1) "3"
["name"] => string(13) "蛇喰 夢子"
["birthday"] => string(10) "2016-10-21"
["class"] => string(6) "はな"
}
["百喰 キラリ"] => array(4) {
["id"] => string(1) "4"
["name"] => string(16) "百喰 キラリ"
["birthday"] => string(10) "2016-11-11"
["class"] => string(6) "もも"
}
["小林 竜胆"] => array(4) {
["id"] => string(1) "5"
["name"] => string(13) "小林 竜胆"
["birthday"] => string(10) "2014-01-13"
["class"] => string(9) "さくら"
}
["幸平 創真"] => array(4) {
["id"] => string(1) "6"
["name"] => string(13) "幸平 創真"
["birthday"] => string(10) "2015-03-13"
["class"] => string(6) "ゆり"
}
["薙切 えりな"] => array(4) {
["id"] => string(1) "7"
["name"] => string(18) "薙切 えりな"
["birthday"] => string(10) "2015-02-10"
["class"] => string(6) "もも"
}
["薙切 アリス"] => array(4) {
["id"] => string(1) "8"
["name"] => string(18) "薙切 アリス"
["birthday"] => string(10) "2015-02-10"
["class"] => string(6) "はな"
}
["司 瑛士"] => array(4) {
["id"] => string(1) "9"
["name"] => string(10) "司 瑛士"
["birthday"] => string(10) "2014-04-28"
["class"] => string(9) "さくら"
}
["葉山 アキラ"] => array(4) {
["id"] => string(2) "10"
["name"] => string(16) "葉山 アキラ"
["birthday"] => string(10) "2015-02-28"
["class"] => string(6) "はな"
}
}
サンプル
class 毎にグループにして id と name を表示する
$sql="SELECT * FROM table";
$result = $mysqli->query($sql);
$list = $result->fetch_all(MYSQLI_ASSOC);
$classes = array_column($list, 'class', 'class');
foreach($classes as $data){
echo $data."組
";
foreach ($list as $val) {
if ($val['class']===$data) {
echo $val['id']." : ".$val['name']."
";
}
}
echo "
";
}
// 結果
はな組
1 : 山田 花子
3 : 蛇喰 夢子
8 : 薙切 アリス
10 : 葉山 アキラ
もも組
2 : 小林 太郎
4 : 百喰 キラリ
7 : 薙切 えりな
さくら組
5 : 小林 竜胆
9 : 司 瑛士
ゆり組
6 : 幸平 創真
特定の誕生日の人がいるかいないか
// 今日が誕生日の人がいるか
$day= new DateTime();
$today=$day->format('Y-m-d');
$birthdays = array_column($list, 'name', 'birthday');
if( isset( $birthdays[$today] ) ) {
echo 'いる';
} else {
echo 'いない';
}
// 結果
いない
// 「2015-02-10」生まれの人がいるか
if( isset( $birthdays['2015-02-10'] ) ) {
echo 'いる';
} else {
echo 'いない';
}
// 結果
いる
array_search()
とか in_array()
とか、検索系 array
関数は遅いので、いる・いない、ある・ないを調べるなら、検索対象をキーにして、 isset()
や array_key_exists()
を使う。
* 誕生日をキーにすると「 2015-02-10 」生まれは 2 人いるので、誰か、何人かは判定できない。