PHPの多次元配列でSQL検索っぽい事をする

前回の記事で、PHP の多次元配列でユニークキー検索のような事をしたので、ついでに複数レコードを取得する SQL っぽい検索のやり方にも触れておこうと思う。

// 使用するデータセット
$data = [
  ["ID" => "1", "NAME" => "hoge", "FAVO" => "oniku"],  // レコード #0
  ["ID" => "2", "NAME" => "piyo", "FAVO" => "yasai"],  // レコード #1
  ["ID" => "3", "NAME" => "foo", "FAVO" => "oniku"]    // レコード #2
];

理解が深まるよう、使用するデータセットは前回の記事のものを流用するので、未読の方は是非先にお読み頂きたい。

配列に含まれる指定キーの値が同じものを全て検索するコード

今回もお題を達成できるコードを先に示しておきますが、前回同様に何度か使用する前提で関数化まで済ませておきます。

function searchFAVO(&$data, $favo) {
  $keys = array_keys(array_column($data, "FAVO"), $favo, true);
  $res = [];

  foreach($keys as $key) {
    $res[] = $data[$key];
  }

  return $res;
}

// $data には前述の配列が格納されている
$res = searchFAVO($data, "oniku");
var_dump($res);
/*
array(2) {
  [0]=>
  array(3) {
    ["ID"]=>
    string(1) "1"
    ["NAME"]=>
    string(4) "hoge"
    ["FAVO"]=>
    string(5) "oniku"
  }
  [1]=>
  array(3) {
    ["ID"]=>
    string(1) "3"
    ["NAME"]=>
    string(3) "foo"
    ["FAVO"]=>
    string(5) "oniku"
  }
}
*/

$res = searchFAVO($data, "okashi");
var_dump($res);
/*
array(0) {
}
*/

FAVO(好きなもの)が oniku なレコードは 2 件、 okashi なレコードは 0 件。

データセットの内容と見比べると、期待する動きであることが確認出来た。

SQL の SELECT みたいなイメージ

前回同様、このコードも SQL のクエリに当てはめて考えると理解しやすいかも知れない。

// PHP
$keys = array_keys(array_column(<テーブル名>, <検索カラム名>), <検索する値>, true);
$res = [];

foreach($keys as $key) {
  $res[] = <レコード内容>;
}
-- MySQL
SELECT <レコード内容> FROM <テーブル名> WHERE <検索カラム名> = <検索する値>;

今回は結果セットを受け取っているので、使う時は while なり foreach なりで、適当にループさせて使うと良い。

// $res は上記の結果セット
foreach($res as $row) {
  echo "{$row["NAME"]}の好物は{$row["FAVO"]}だそうだ。\n";
}

こんな感じ。

 

array_keys の仕様

先に実行される array_column の仕様は前回学んだので、今回は array_keys の仕様だけを見て行く。

array_keys(array $array, mixed $filter_value, bool $strict = false): array

第1引数に検索したい値(前述の<検索する値>)を渡し、第2引数に検索したい配列(array_column の結果)を渡す。

第3引数の $strict に true を指定すると、比較が厳密化(型比較など)するので、前回と同じ理由で true を指定する事をおススメする。

そして、検索する値と等しい全てのキーを配列で返してくる。(※何も見つからなくても空の配列が返って来る。)

前回の記事で使った array_search との違いは、

  • 最初に発見したキーだけを返す。
  • 発見したキーを全て返す。
  • 発見出来なくても空の配列を返す。

と言う点になる。

この配列に含まれるキーは、array_search で取得したものと同じ性質なので、$data のキー指定に使うことで期待通りの動作になる。

このコードは地味に便利なので、頭の片隅に置いておくと役に立つ日が来るかも知れない。

 

関連記事

PHPの多次元配列でユニークキー検索っぽい事をする

PHParray_column,array_keys

Posted by theuri