🙌

【PHP】初心者向け、多次元配列に組み込み関数を使い新しい配列を作るときのメモ

2023/06/07に公開

本日はPHPのforeach文やarray_columunを学習していた時に

(自分のレベルに)合っているソースコードをが公開されていたので写経していました。

自分が理解するのに時間が掛かったため、解説をしながら書いていきます。

参考

https://qiita.com/kty000/items/8233f25577726ff40354

@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"
      }
    }
  }
}

□全体の解説

まず全体の流れを整理すると、以下のようになります!

  1. $member_listという空の配列を作成する。
  2. 元の配列$mst_memberの各要素(メンバー)を一つずつ取り出し、その'id'と'name'を含む新しい配列を作成する。
  3. そのメンバーの'sex_id'が$member_listにすでに存在するかを確認し、存在する場合はその'sex_id'の'name_list'に新しく作成したメンバー情報を追加する。
  4. もし'sex_id'が$member_listにまだ存在しない場合は、新しい配列を作成し、その'sex_id'と空の'name_list'を設定する。その後、その新たに作成した配列に新しく作成したメンバー情報を追加する。
  5. 以上をすべてのメンバーに対して繰り返す。
    以上が、このコードの主な処理の手順となります。

□流れ解説

$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を組み合わせて、
現在のmember['sex_id']の値(つまり1)を代入し、array_pushで現在のindexを参照した['name_list']に2週目の $name_list_info を追加する。

これがsex_idが変わるまで(このコードの場合2,四週目)まで続けて、ifで分岐する。

といった流れでございます!

あとがき

実際言葉に、文字に起こすとなかなか難しいですね。
foreach文はと配列は自分もまだまだ勉強中です。

変なコードや表現があった場合は指摘いただけると幸いでございます。

参考

https://www.php.net/manual/ja/function.array-push.php
https://www.php.net/manual/ja/function.array-column.php
https://www.php.net/manual/ja/function.array-search.php
https://www.php.net/manual/ja/function.in-array.php

Discussion