Gå til innhold

Hjelp til å lage en enkel navneliste sortert alfabetisk


Anbefalte innlegg

Jeg prøver å få til en navneliste som er delt inn i grupper utifra hvilken bokstav de har først i navnet sitt.

Koden jeg har nå gir meg bare en lang liste, men jeg trenger å legge inn litt html mellom hver forbokstav. Så while løkka må stoppe når det ikke er flere som starter på bokstaven A og så legge inn litt html for så å starte på de som starter på bokstaven B etc...

$q1 = $pdo->query("SELECT name FROM names ORDER BY name ASC");
echo "<h3>A</h3>";
echo "<ul>";
while ($row = $q1->fetch()){
  echo "<li>" . $row['name'] . "</li>";
}
echo "</ul>";

Jeg tror kanskje løsningen ligger i å ha løkker inne i løkker eller noe, men jeg har ikke nok programmeringserfaring til at jeg skjønner hvordan jeg skal få til det.

 

Det er en sånn her jeg vil at det skal bli:

<h3>A</h3>
<ul>
  <li>Arne</li>
  <li>Arnt</li>
</ul>

<h3>B</h3>
<ul>
  <li>Bjarne</li>
  <li>Bjørn</li>
</ul>

<h3>C</h3>
<ul>
  <li>Christian</li>
  <li>Christine</li>
</ul>

...
Lenke til kommentar
Videoannonse
Annonse

En måte kan være å lage en liten hjelpefunksjon som gruperer navnene for deg. F.eks slik:

function groupBy($items, $keyFunc){
    $groups = [];
    foreach($items as $item){
        $key = $keyFunc($item);
        if(!isset($groups[$key]))
            $groups[$key] = [];
        $groups[$key][] = $item;
    }
    return $groups;
}
 

$q1 = $pdo->query("SELECT name FROM names ORDER BY name ASC");
$names = $q1->fetchAll(PDO::FETCH_ASSOC);
 
// Group the names by the first letter in the name
$groupedNames = groupBy($names, function($name){return mb_substr($name['name'], 0, 1);});
 
foreach($groupedNames as $title => $names){
    echo '<h3>', $title, '</h3>';
    echo '<ul>';
    foreach($names as $name){
        echo '<li>',$name['name'],'/li>';
    }
    echo '</ul>';
}
Lenke til kommentar

Den koden gjør nøyaktig det jeg var ute etter.

Tusen takk!

 

Jeg skjønner de to foreach løkkene. Det var noe sånn jeg hadde tenkt også, men jeg klarte bare ikke å lage den matrisen med navnene gruppert. 

 

Jeg skjønner også litt av den funksjonen som henter ut forbokstaven med mb_substr().

Men den funksjonen som du kalte groupBy() må jeg tygge litt på ;)

Lenke til kommentar

Det er mulig å gjøre det uten den hjelpefunksjonen også, men da blir loopen som printer outputen litt mer komplisert. Fordelen med groupBy-funksjonen er at den kan gjennbrukes til andre lignende problemer.

 

Måten groupBy fungerer på er at den tar inn en liste med items, en item kan være hva som helst. Deretter looper den gjennom itemsene og hver item sendes inn i $keyFunc for å generere en key som brukes i grupperingen.

 

$keyFunc er en funksjon som brukeren av groupBy sender inn, den får inn en item som eneste argument og må returnere noe som kan brukes som en key i $groups arrayet. Dette fungerer fordi man kan lagre funksjoner i variabler i PHP, og da kan man kalle variabelen som om det var en vanlig funksjon.

 

For hver item får man da en key. Hvis keyen ikke eksisterer i groups-arrayet så opprettes det en ny gruppe for den keyen med en tom liste, deretter legges itemen til gruppen den tilhører.

 

Man ender da opp med et array av typen:

[
    'key1' => ['item1', 'item2'],
    'key2' => ['item3'],
     ...
]
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...