Als ik een echo doe van mijn tabel hoe kan ik aan het einde van de regels afsluiten met een punt. Ik wil nl een overzicht maken bijv. appel, peer, kers, druif.



<?php 

$sql = "SELECT * FROM vruchten";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo $row['fruit'];
    echo ', ';
  }
} else {
  echo "geen resultaat";
}
?>
 <?php
if ($result->num_rows > 0):
	$vruchtenArr = [];
	while($row = $result->fetch_assoc()):
		$vruchtenArr[] = $row['fruit'];
	endwhile;
	echo '<pre>' . print_r( $vruchtenArr, TRUE ) . '</pre>';
	echo '<p>' . implode( ', ', $vruchtenArr) . '.</p>';
endif;
?>
Als je in plaats van de directe echo eerst een hulpvariabele met een string voor je $output introduceert, kun je die fatsoeneren met:

<?php

$output = rtrim($output, ', ') . '.';

?>
En hoe kan ik dat toepassen die $output?
Zo.

 $output = implode( ', ', $vruchtenArr);
echo '<p>' . $output . '.</p>';
Ik heb nu deze code gemaakt maar en die werkt bij 2 of meer regels. Behalve als ik 1 regel heb dan zet hij er ook een , achter! Hoe los ik dat op?


<?php

$sql = "SELECT * FROM vruchten";
$result = $conn->query($sql);

$i = 0;
if($num = $result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo $row['fruit'];
    
    if( $i < $num ) {
       echo ',';
     }
   $i++;
  }
} else {
  echo "geen resultaat";
}
?>
Testen of je 1 of meerdere regels hebt in het $result.

$i is in het begin altijd minder dan num_rows.

Je kunt ook 1 van de gegeven oplossingen toepassen.
Wat is er mis met implode(), Kees?
Kees Mulder op 03/01/2023 12:32:26

Ik heb nu deze code gemaakt maar en die werkt bij 2 of meer regels. Behalve als ik 1 regel heb dan zet hij er ook een , achter! Hoe los ik dat op?

Het makkelijkste is door de $i++ (regel 15) vóór het if-statement te plaatsen (regel 11, bijvoorbeeld). Dat lijkt me semantisch ook correcter.
Mijns inziens is implode() hiervoor de juiste benadering, zoals reeds genoemd door Adoptive Solution en Ariën.
Ozzie PHP op 06/01/2023 13:14:17

Mijns inziens is implode() hiervoor de juiste benadering, zoals reeds genoemd door Adoptive Solution en Ariën.

Ik heb altijd geleerd dat er niet zoiets als "de juiste benadering" bestaat. Er zijn altijd redenen waarom een andere benadering wellicht beter is. Het nadeel van implode() is dat je de resultset in een array moet hebben; je moet dus eerst de gehele resultset verwerken voor je output kunt genereren. Is geen optie als je bijvoorbeeld tussenresultaten wilt laten zien.

Als je het mij persoonlijk zou vragen, zou ik zeggen dat het de juiste benadering zou zijn om geen PHP te gebruiken, maar Perl; dat werkt veel efficiënter:

my $sql = 'SELECT * FROM vruchten';
my @results = $conn->selectrow_array($sql, { Slice => {} });
say @results ? join ',', map { $_->{fruit} } @results : 'geen resultaat';

Maar ja, aangezien dit een PHP-forum is, kun je dus ook bij deze code niet spreken van 'de juiste benadering'. :-)

Reageren