Sorteren van gegevens in verschillende groepen

Status
Niet open voor verdere reacties.

davidius

Gebruiker
Lid geworden
22 okt 2008
Berichten
10
Hallo allemaal.

Ik zit met het volgende probleem. Ik ben aan het proberen om een navigatiemenu te maken met links naar verschillende producten. aangezien het aantal producten kan oplopen, wil ik deze splitsen in groepjes, gesorteerd volgens de beginletter van het product. De groepjes zijn dan 0-9 , A-H , I-P , Q-Z
Nu vraag ik me af hoe ik dit het beste doe. Ik heb nu een oplossing gevonden, maar ik denk dat deze nogal omslachtig is, en volgens mij kan het veel korter.
Na het oproepen van mijn database ziet de code er als volgt uit:
PHP:
<div id="main">
		<ul id="dropdown-demo" class="dropdown">
			<li><a>FAB200</a></li>
				<ul>
					<li><a>0-9</a></li>
						<ul>

<?
$i=0;
while ($i < $num) {
$fab=mysql_result($result,$i,"fab");
$naam=mysql_result($result,$i,"naam");
$link=mysql_result($result,$i,"link");
$rest=substr($naam, 0, 1);
if ($fab == "200") {
	if (is_numeric($rest)) {
?>
<li><a href="<? echo "$link"; ?>" target="frame1"><? echo "$naam"; ?></a></li>
<?
}
}
++$i;
}
?>
</ul>
				<li><a>A-H</a></li>
					<ul>
<?
$i=0;
while ($i < $num) {
$fab=mysql_result($result,$i,"fab");
$naam=mysql_result($result,$i,"naam");
$link=mysql_result($result,$i,"link");
$rest=substr($naam, 0, 1);
if ($fab == "200") {
	if ($rest >=A && $rest <=H) {
?>
<li><a href="<? echo "$link"; ?>" target="frame1"><? echo "$naam"; ?></a></li>
<?
}
}
++$i;
}
?>
</ul>

dit gaat zo door voor alle 4 de groepen. Nu wil ik ook dat als de groep leeg is, hij de regel
PHP:
<li><a href="<? echo "$link"; ?>" target="frame1"><? echo "$naam"; ?></a></li>
weglaat, en direct doorgaat naar de volgende groep.
Kan iemand mij hierbij helpen? Als bijkomende info nodig is zal ik deze gerust geven.

Alvast bedankt
 
Wat is FAB precies?

Komen de resultaten op volgorde terug?

Zo ja, dan kun je gebruik maken van een array met de bounds erin.
Ik ga even uit van een gewone array met woorden erin; je moet het zelf maar in je script passen :)

PHP:
// defineer de bounds die je wilt aanhouden
$bounds = ( '0', '9', 'A', 'H', 'Z' );
// selecteer de eerste bound als lower bound
$lower_bound = array_shift( $bounds );
// selecteer de tweede bound als upper bound
$upper_bound = array_shift( $bounds );

// we hebben nog geen resultaat voor deze groep
$resultaat = false; 
// loop over je resultaat set heen (pas op: deze moet al gesorteerd zijn, maar dat lijkt je eigen lijst ook)
while ( $word = array_pop( $words ) ) {
  // je kunt een letter binnen een string aanspreken door {} te gebruiken :)
  // $word{x] is hetzelfde als substr( $word, x, 1 );
  if ( $word{0} >= $lower_bound && $word{0} <= $upper_bound ) {
    if ( $resultaat == false ) { 
      //@todo: hier output je je kopje
    }
    // nu hebben we wel een resultaat, zodat het kopje niet nog een keer getoond wordt
    $resultaat = true;
    //@todo: hier output je de link zelf
  }
  else {
    // kijk of er nog meer bounds zijn
    if ( is_array ( $bounds ) ) {
      // het woord zit niet tussen de bounds, dus we selecteren de volgende bounds
      // de lower bound wordt onze vorige upper, en de nieuwe upper selecteren we uit de array
      $lower_bound = $upper_bound;
      $upper_bound = array_shift( $bounds );
      // het huidige element is nog niet gedaan, dus dat plaatsen we terug aan het begin van de array
      // op deze manier wordt het opnieuw gekozen en uitgevoerd
      $words = array_merge ( array( $word ), $words );
    }
    else {
      // het resultaat valt buiten alle bounds. wat je dan precies wilt doen is aan jou
      // @todo: de loop is niet succesvol, maar kan ook niet verder.
    }
  }
}


Deze code is niet getest, maar ik denk dat het wel werkt en het is meer een leidraad dan een kant en klare oplossing ;)
 
super, dit ga ik eens testen straks.
Een kant en klare oplossing heb ik ook niet nodig, van dit kan ik nog iets leren.
Met FAB wordt onze cleanroom bedoeld, de 200mm FAB en de 300mm FAB. De grootte staat voor de waferdiameter die in de cleanroom behandeld wordt.

De resultaten komen idd op volgorde terug
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan