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 のキー指定に使うことで期待通りの動作になる。
このコードは地味に便利なので、頭の片隅に置いておくと役に立つ日が来るかも知れない。
関連記事