以下のようにprojectテーブルとclientテーブルがDBに存在し、LEFT JOINで結合した結果をclient.id順にソートして取得するとします。

```

    mysql> SELECT p.id, p.project_name, p.client_id, c.client_name FROM project p LEFT JOIN client c ON p.client_id = c.id WHERE p.active_flag = '1' ORDER BY c.id DESC ;
    
```

取得結果

```

    +-----+--------------------------------------------------------------+-----------+-------------+
    | id  | project_name                                                 | client_id | client_name |
    +-----+--------------------------------------------------------------+-----------+-------------+
    |  50 | Aリスト                                           　　　　　　　　|         9 | admin       |
    | 188 | Bリスト                                                        |         9 | admin       |
    |   7 | Cリスト                                                        |         2 | user      |
    |   8 | Dリスト                                                        |         2 | user      |
    
```

上記の結果をclient_name毎にカテゴリー分けして出力するにはどの様な方法があるのでしょうか？

出力としては以下の様なHTMLにしたいと考えています。

  * admin 
    * Aリスト 
    * Bリスト 
  * user 
    * Cリスト 
    * Dリスト 

ご教示いただけますと幸いです。  
よろしくお願い致します。
CC BY-SA 3.0
2017-03-09T12:52:12.893
33220
2018-12-11T14:01:00.223
8500
question
php mysql
phpの配列でidが同じ物をカテゴリー分けして出力したい
多次元配列はどうでしょう

```

    $a['client_name']['project_name']
    
```
CC BY-SA 4.0
2017-03-27T06:24:04.500
33568
2018-08-07T08:19:16.980
2018-08-07T08:19:16.980
3060
21211
33220
answer
まず、PHP側でデータベースからデータを取得するには、PDOを使うのが一般的です。PDOを用いてSQL文を実行し、データを取得するには以下のようにします。

```

    //データベースへ接続する。
    $dsn = 'mysql:dbname=yourdbname;host=yourhost';
    $user = 'youruser';
    $password = 'yourpass';
    $dbh = new PDO($dsn, $user, $password);
    
    // SQL文を実行する。
    $sql = "SELECT p.id, p.project_name, p.client_id, c.client_name 
            FROM project p LEFT JOIN client c ON p.client_id = c.id 
            WHERE p.active_flag = '1' 
            ORDER BY c.id DESC";
    $sth = $dbh->prepare($sql);
    $sth->execute();
    
    //SQL文で指定したすべてのデータを取得する。
    $result = $sth->fetchAll();
    
```

DBから取得後のデータをclient_nameごとに出力するのであれば、client_nameをキーとした配列を作成しましょう。

```

    //データをclient_id,project_idごとに配列へ格納する。
    $data = array();
    foreach($result as $project){
        $client_name = $project['client_name'];
        $project_id = $project['id'];
        $data[$client_name][$project_id] = $project;
    }
    
```

あとは、HTMLへ表示するだけなので、$dataをforループを用いて出力するだけです。

```

    print "<ul>";
    foreach($data as $client_name => $projects){
        print "<li>{$client_name}";
        print "<ul>";        
        foreach($projects as $project){
            print "<li>{$project['project_name']}</li>";
        }
        print "</ul>";
    }
    print "</ul>";
    
```
CC BY-SA 3.0
2017-04-09T10:34:45.763
33884
2017-04-09T10:34:45.763
33220
answer