[PHP] array_columnでDB結果セットから特定カラムの配列を作る

2019-05-23PHP高速化

array_column は、DB の検索結果とか多次元配列から、特定のカラムや、特定のカラムの値をキーにした新しい配列を作る関数。あるカラムの値があるかないかとか、あるカラムの値でグループ分けしたり、ページを分けたい時とかに便利。この関数を使ったサンプルも記載。

PHP5.5 から登場し、 PHP7.0 からはオブジェクトの配列も扱える。

書式

array_column ( array $list , 多様な型 $column_key [, 多様な型 $index_key = NULL ] )

第 1 引数( 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 人いるので、誰か、何人かは判定できない。

Posted by Agopeanuts