mysql_*関数不使用の原則はすでに回答があるとおりなのでとりあえずおいておいて
ぱっと思いつく考え方が3つあります。
- 表示の際に前のものと比べる処理を入れる
- データ整理を先にしてから表示する
- カテゴリを先に抽出する
表示の際に前のものと比べる処理を入れる
※ローテクで、最初からカテゴリ順に並んでいるのが原則
PHP
1$a=[
2 ["c"=>"c1","n"=>"n2","p"=>3],
3 ["c"=>"c1","n"=>"n3","p"=>4],
4 ["c"=>"c1","n"=>"n5","p"=>6],
5 ["c"=>"c2","n"=>"n7","p"=>8],
6 ];
7
8$preCategory="";
9foreach($a as $row){
10 if($preCategory!==$row["c"]){
11 print "<hr>".$row["c"]."<br><hr>";
12 $preCategory=$row["c"];
13 }
14 print $row["n"]."<br>";
15 print $row["p"]."<br>";
16}
データ整理を先にしてから表示する
PHP
1$a=[
2 ["c"=>"c1","n"=>"n2","p"=>3],
3 ["c"=>"c1","n"=>"n3","p"=>4],
4 ["c"=>"c1","n"=>"n5","p"=>6],
5 ["c"=>"c2","n"=>"n7","p"=>8],
6 ];
7$rows=[];
8foreach($a as $row){
9 $val=&$rows[$row["c"]][];
10 $val["n"]=$row["n"];
11 $val["p"]=$row["p"];
12}
13
14foreach($rows as $key=>$row){
15 print "<hr>".$key."<hr>";
16 foreach($row as $val){
17 print $val["n"]."<br>";
18 print $val["p"]."<br>";
19 }
20}
21
カテゴリを先に抽出する
PHP
1$a=[
2 ["c"=>"c1","n"=>"n2","p"=>3],
3 ["c"=>"c1","n"=>"n3","p"=>4],
4 ["c"=>"c1","n"=>"n5","p"=>6],
5 ["c"=>"c2","n"=>"n7","p"=>8],
6 ];
7$categories=array_unique(array_map(function($x){return $x["c"];},$a));
8foreach($categories as $c){
9 print "<hr>".$c."<hr>";
10 foreach(array_filter($a,function($x) use($c){return $x["c"]==$c;}) as $val) {
11 print $val["n"]."<br>";
12 print $val["p"]."<br>";
13 }
14}
※カテゴリの抽出は別途「SELECT DISCTINCT category」的な方法で先に得たほうが
効率がよいかもしれません。