4

サンプルテーブルを次に示します。

info table
info_id     name  
1           john  
2           peter
------------------------  
details table  
details_id      log                               date  
1            test log for john                  2013-08-01  
1            another log for john               2013-08-02  
2            test log for peter                 2013-08-02

サンプルクエリは次のとおりです。

SELECT info.info_id, info.name, details.details_no, details.log, details.date 
FROM info JOIN details ON details.details_id = info.info_id 
GROUP BY info.info_id  

そして、ここに私が達成したい表示があります:

john  
1     test log for john            2013-08-01  
1     another test log for john    2013-08-02  

peter  
2     test log for peter           213-08-02  

foreach ループを使用してから、最初のループ内で別の foreach ループを実行してみました。

みんな助けてください

4

5 に答える 5

11

結果を以下のような多次元配列にしてみてください

注:それがテーブルdetails.details_noの主キーであり、次のような結果が必要であると想定していますdetails

john  
1     test log for john            2013-08-01  
2     another test log for john    2013-08-02  

peter  
3     test log for peter           213-08-02

次の方法で取得できます

...
$qry = "
    SELECT
        info.info_id,
        info.name,
        details.details_no,
        details.log,
        details.date 
    FROM
        info
        JOIN details ON (details.details_id = info.info_id)
";
$result = mysqli_query($your_db_link,$qry)
$data = array();
while($row = mysqli_fetch_array($result)){
    $data[$row["info_id"]]["name"] = $row["name"];
    $data[$row["info_id"]]["logs"][$row["details_no"]] = array(
        "log"=>$row["log"],
        "date"=>$row["date"],
    );
}

次のような配列になります。

$data = array(
    "1" => array(
        "name" => "john",
        "logs" => array(
            "1" => array(
                "log" => "test log for john",
                "date" => "2013-08-01",
            ),
            "2" => array(
                "log" => "another test log for john",
                "date" => "2013-08-02",
            ),
        ),
    ),
    "2" => array(
        "name" => "peter",
        "logs" => array(
            "3" => array(
                "log" => "test log for peter",
                "date" => "2013-08-02",
            ),
        ),
    ),
);

次に、次のように表示できます。

echo "<table>";
foreach($data as $value){
    echo "<tr><td colspan='3'>".$value["name"]."</td></tr>";
    foreach($value["logs"] as $subkey => $subvalue){
        echo "<tr>";
        echo "<td>".$subkey."</td>";
        echo "<td>".$subvalue["log"]."</td>";
        echo "<td>".$subvalue["date"]."</td>";
        echo "</tr>";
    }
}
echo "</table>";

次のような結果になります。

<table>
    <tr>
        <td colspan='3'>john</td>
    </tr>
    <tr>
        <td>1</td>
        <td>test log for john</td>
        <td>2013-08-01</td>
    </tr>
    <tr>
        <td>2</td>
        <td>another test log for john</td>
        <td>2013-08-02</td>
    </tr>
    <tr>
        <td colspan='3'>peter</td>
    </tr>
    <tr>
        <td>3</td>
        <td>test log for peter</td>
        <td>2013-08-02</td>
    </tr>
</table>
于 2013-07-31T20:53:30.320 に答える
4

おそらく、データを取得して、必要な配列を作成する必要があります。

$data = array();
foreach ($result as $item) {
    $key = $item['name']; // or $item['info_id']
    if (!isset($data[$key])) {
        $data[$key] = array();
    }

    $data[$key][] = $item;
}

// Build your table with the new $data array

編集

これはほんの一例です。amaster507 が指摘しているように、nameフィールドが一意でない場合は、一意のキーで配列を構築する必要があります。$item['name']おそらく のインスタンスをに変更するだけでよいので、これとそれほど違いはありません$item['info_id']

于 2013-07-31T20:17:41.420 に答える
0

わかりました、最初に問題の説明。

を使用するGROUP BYと、すべての結果が行として取得されるのではなく、グループ化されたコンテンツを含む 1 つの行が取得されます。つまり、たとえば、john からGROUP BY両方のセルを連結したようなものを取得するために使用できます。log

必要なことを行うには、を削除しGROUP BYてすべての行を取得し、手動で処理します。

この場合、列に基づいて、サブ配列にグループ化された配列を返す関数が呼び出されるunderscore.phpを使用して、仕事を簡単にすることをお勧めします。groupByinfo_id

次のように使用されます。

$array_with_all_the_rows = $query->fetchAll(); // Or whatever you use to get all rows in 1 array.
$grouped_array = __::groupBy($array_with_all_the_rows, 'info_id');

そのグループ化された配列は次のようになります。

$grouped_array = Array( 
    "1" => Array(
        "info_id"=> "1", "log"=>"test log for john", "date" => "2013-08-01",
        "info_id"=> "1", "log"=>"another test log for john", "date" => "2013-08-02"
    ), 
    "2" => Array(
        "info_id"=> "2", "log"=>"test log for peter", "date" => "2013-08-02"
    )
)
于 2013-07-31T20:23:48.187 に答える
-1

キーと値のペアで foreach を試しましたか? 現在の for ループを見せてもらえますか? 結果の配列の print_r/var_dump により、誰かがあなたを助けやすくなります。

foreach ($result as $key=>$value) {
  print "Name Row\n";
  for (each display row) {

それまたは Ascherer が提案するように、ネストされた for ループを不要にする新しい多次元配列を作成します。

于 2013-07-31T20:20:58.063 に答える