Během iterace můžete udržovat určitý stav, který sleduje, zda je aktuální řádek novým názvem/splatným:
$last_name_seen = NULL;
while ($row = mysql_fetch_array($result)) {
$firstname = "";
$payable = "";
if ($last_name_seen === NULL || $row['firstname'] != $last_name_seen) {
$last_name_seen = $row['firstname'];
$firstname = $row['firstname'];
$payable = $row['payable'];
}
echo '<tr>';
echo '<td style="border: 1px solid black;">'.$firstname.'</td>';
echo '<td>'.$payable.'</td>';
echo '<td>'.$row['product'].'</td>';
echo '<td>'.$row['qty'].'</td>';
echo '</tr>';
}
Všimněte si, že váš dotaz MySQL by měl mít nějaké ORDER BY
klauzule, abyste vygenerovali požadované uspořádání, např.
ORDER BY Name, Product;
Jak také naznačují výše uvedené komentáře, pokud používáte zastaralé PHP API, měli byste zvážit upgrade na něco modernějšího. Ale logika použitá ve výše uvedené smyčce by se změnou MySQL API příliš nezměnila.