【PHP】初心者向け、多次元配列に組み込み関数を使い新しい配列を作るときのメモ
本日はPHPのforeach文やarray_columunを学習していた時に
(自分のレベルに)合っているソースコードをが公開されていたので写経していました。
自分が理解するのに時間が掛かったため、解説をしながら書いていきます。
参考
@kty000(みちゃ) 様
コード概要
多次元配列から、特定のkeyごとにまとめた多次元配列を作る。
【追記】今回はsex_idをキーとした、新しい配列を作りたいという状況です。
※コードは少し変更を加えております。
$mst_member = [
0 => ["id" => 1, "sex_id" => 1, "name" => "sample1"],
1 => ["id" => 2, "sex_id" => 1, "name" => "sample2"],
2 => ["id" => 3, "sex_id" => 1, "name" => "sample3"],
3 => ["id" => 4, "sex_id" => 2, "name" => "sample4"],
4 => ["id" => 5, "sex_id" => 2, "name" => "sample5"],
];
$member_list = array();
foreach ($mst_member as $member) {
$name_list_info = [];
$name_list_info ['id'] = $member['id'];
$name_list_info ['name'] = $member['name'];
if(in_array($member['sex_id'], array_column($member_list,'sex_id'))){
$index = array_search($member['sex_id'], array_column($member_list,'sex_id'));
array_push($member_list[$index]['name_list'], $name_list_info);
} else {
$member_list_info = array();
$member_list_info ['sex_id'] = $member['sex_id'];
$member_list_info ['name_list'] = array();
array_push($member_list_info['name_list'], $name_list_info );
array_push($member_list, $member_list_info);
}
}
var_dump($member_list);
出力結果
array(2) {
[0]=>
array(2) {
["sex_id"]=>
int(1)
["name_list"]=>
array(3) {
[0]=>
array(2) {
["id"]=>
int(1)
["name"]=>
string(7) "sample1"
}
[1]=>
array(2) {
["id"]=>
int(2)
["name"]=>
string(7) "sample2"
}
[2]=>
array(2) {
["id"]=>
int(3)
["name"]=>
string(7) "sample3"
}
}
}
[1]=>
array(2) {
["sex_id"]=>
int(2)
["name_list"]=>
array(3) {
[0]=>
array(2) {
["id"]=>
int(4)
["name"]=>
string(7) "sample4"
}
[1]=>
array(2) {
["id"]=>
int(5)
["name"]=>
string(8) "sample15"
}
[2]=>
array(2) {
["id"]=>
int(6)
["name"]=>
string(8) "sample16"
}
}
}
}
□全体の解説
まず全体の流れを整理すると、以下のようになります!
- $member_listという空の配列を作成する。
- 元の配列$mst_memberの各要素(メンバー)を一つずつ取り出し、その'id'と'name'を含む新しい配列を作成する。
- そのメンバーの'sex_id'が$member_listにすでに存在するかを確認し、存在する場合はその'sex_id'の'name_list'に新しく作成したメンバー情報を追加する。
- もし'sex_id'が$member_listにまだ存在しない場合は、新しい配列を作成し、その'sex_id'と空の'name_list'を設定する。その後、その新たに作成した配列に新しく作成したメンバー情報を追加する。
- 以上をすべてのメンバーに対して繰り返す。
以上が、このコードの主な処理の手順となります。
□流れ解説
$member_list = array();
1はそのままですね、まず新しく配列を作るのでソレを作成します。
$name_list_info = [];
$name_list_info ['id'] = $member['id'];
$name_list_info ['name'] = $member['name'];
2はforeachで$memberをぐるぐる回すので、それぞれの周回でのidとnameを格納するのが
目的です
if(in_array($member['sex_id'], array_column($member_list,'sex_id'))){
$index = array_search($member['sex_id'], array_column($member_list,'sex_id'));
array_push($member_list[$index]['name_list'], $name_list_info);
3は、ここがちょいムズです
まず、if(in_array( 〜 ではin_arrayで$member['sex_id']の値が(一周目は1)
array_columnで$member_list,'sex_id'の中に値が存在するかをチェックしています(一週目は何も入っていないのでfalse)。
$member_list_info = array();
$member_list_info ['sex_id'] = $member['sex_id'];
$member_list_info ['name_list'] = array();
array_push($member_list_info['name_list'], $name_list_info );
array_push($member_list, $member_list_info)
4で、もしmember_list['sex_id']の中にmember['sex_id']の値が存在していなかったら
member_list_infoという配列を作り、現在のmember['sex_id'] を追加する。
その後['name_list']というキーの配列を作りたいため空の配列を代入しておく。
array_push関数で先ほどのname_listにname_list_infoを代入して
最初に作ったmember_list配列にmember_listをそのまま追加する。
5.二週目は
if(in_array($member['sex_id'], array_column($member_list,'sex_id'))){
$index = array_search($member['sex_id'], array_column($member_list,'sex_id'));
array_push($member_list[$index]['name_list'], $name_list_info);
ここの($member_list,'sex_id')が先ほど追加されてtrueになるので
$indexにarray_search関数とarray_columnを組み合わせて、
現在の
これがsex_idが変わるまで(このコードの場合2,四週目)まで続けて、ifで分岐する。
といった流れでございます!
あとがき
実際言葉に、文字に起こすとなかなか難しいですね。
foreach文はと配列は自分もまだまだ勉強中です。
変なコードや表現があった場合は指摘いただけると幸いでございます。
参考
Discussion