これを行うには多くの方法があります。一部の手法では、動的ピボットを準備するためにSQLが使用されます。以下の私のスニペットは、phpを使用してピボットを実行します。
-
foreach()
を使用して結果セットオブジェクトをループします --いいえ、結果オブジェクトは反復可能であるため、データにアクセスするためにフェッチ関数を呼び出す必要はありません。 - 名前を第1レベルのキーとして、次に年をキーとして、値を値としてサブ配列を使用して、多次元のグループ化配列を作成します。
- 一意の年の配列を作成します。私のアプローチでは、キーと値の両方として年を割り当てることで一意性を確保します。配列には重複したキーを含めることができないため、
array_unique()
を呼び出さなくても値は一意になります。 後で。 - ASCの年を並べ替える
- 毎年のデフォルト値の配列を作成します。この場合、
-
を割り当てています デフォルト値として。 - 文字通りの単語
name
を追加します 一意の年を含む配列の先頭に-これは、テーブルのヘッダー行に入力するために使用されます。 -
implode()
を使用することを好みます 可変セルのテーブル行を作成します。 -
printf()
リテラルテキストと変数をブレンドするクリーンな方法です。補間/連結構文を回避します。 - 後続の各テーブル行で、デフォルトの年間値を相対的な人物の年間値に置き換え、
implode()
で表示します。 。 - 結果セットが空である可能性がある場合は、このスニペットの大部分を
if ($resultObject) { ... }
でラップすることをお勧めします。 ブロックします。
コード:(デモ )
$grouped = [];
$columns = [];
$resultObject = $mysqli->query("SELECT `name`, `value`, `year` FROM `Testab`");
foreach ($resultObject as $row) {
$grouped[$row['name']][$row['year']] = $row['value'];
$columns[$row['year']] = $row['year'];
}
sort($columns);
$defaults = array_fill_keys($columns, '-');
array_unshift($columns, 'name');
echo "<table>";
printf(
'<tr><th>%s</th></tr>',
implode('</th><th>', $columns)
);
foreach ($grouped as $name => $records) {
printf(
'<tr><td>%s</td><td>%s</td></tr>',
$name,
implode('</td><td>', array_replace($defaults, $records))
);
}
echo "</table>";
出力:(読みやすくするために間隔/タブが追加されています)
<table>
<tr>
<th>name</th> <th>2018</th> <th>2019</th> <th>2020</th>
</tr>
<tr>
<td>Tom</td> <td>15</td> <td>4</td> <td>6</td>
</tr>
<tr>
<td>Kate</td> <td>18</td> <td>20</td> <td>-</td>
</tr>
</table>