Gå til innhold

Hvordan sortere MySQL database-innhold i PHP-tabell


Anbefalte innlegg

Hei.

Jeg har laget en tabell hvor innholdet fra min MySQL-database presenteres, men har noen spørsmål angående sortering av denne vha PHP.

Det å sortere alfabetisk er enkelt, for det klarte jeg helt selv :)
Men jeg vil i tillegg at dataene skal sorteres i kategorier, dvs under A, B, C, D...etc.

La oss si at jeg har en php som echo'er ut $frukt.
Det jeg vil, er å få presentert de ulike fruktene (som ligger i databasen) på følgende måte i tabellen:

A

aprikos

appelsin

 

 

B

banan

 

etc.

Er det noen som kan hjelpe meg med dette?

På forhånd takk.

 

Lenke til kommentar
Videoannonse
Annonse

Hei klart det!

<?php
require_once 'core/init.php';
$db = new Database; // Databaseklasse PDO
// Spekter
$lr = range('A','Z');
$fl = array(); //Klargjør array for liste over frukter
foreach ($lr as $l) { //Foreach letter
	$r = $db->getInstance()->get('frukt_tabell',array('letter','=',$l)); //Hent frukt for bokstav
	if ($r->results()) { //Hvis det er noen resultater
		//Dette er fruktene med under gjeldene bokstav
		$fruits = $r->results();
		//For hver frukt putt inn i array med bokstav
		foreach ($fruits as $fruit) {
			$fruitlist[$l][] = $fruit;
		}
	}
}
?>

Det ble mye for et innlegg så jeg satt opp et fungerende eksempel her.

Bare spør om du lurer på noe.

Lenke til kommentar

Alt du trenger å gjøre er å kjøre en substr funksjon på fruktnavn feltet fra databasen før du setter det inn i en array

// koble til databasen og hent ut data her

$fruits = array();

// $dbFruitsData = resultatet fra databasen/select'en
foreach ($dbFruitsData as $fruit){
    $firstLetter = mb_substr($fruit,0,1);

    $fruits[$firstLetter][] = $fruit; 
}

// sjekk innhold i $fruits
echo '<pre>' . print_r($fruits, true) . '</pre>';
Endret av Crowly
Lenke til kommentar

Hei igjen.

Det ble litt vrient for meg med alle disse oppdiktede $fruit, så jeg tror det er like greit at jeg poster hele php'en min. Hvordan kan jeg få smeltet det dere her har skrevet sammen med koden min?
(Database-tabellen min inneholder også en kolonne som heter "first_letter" om det hjelper...)

Her kommer koden:

<?php

//Include login
include " ";

$result = mysql_query("SELECT * FROM blomstergalleriet ");
$num_rows = mysql_num_rows($result);


echo "<p class='text-info'>Galleriet inneholder for tiden $num_rows ulike arter av planter.</p>";

?>

<div id="results">
<div class="row">
<div class="col-xs-12">

<?php

header("script-type: text/css");

$sql = mysql_query("SELECT * FROM blomstergalleriet ORDER BY name_no ");

$limit = 2;
$count = 0;

echo "<div class='container'>
<div class='row'>
<div class='col-md-8'>
<div class='col-xs-12'><table class='table table-striped table-hover' width='100%'>";

while($row = mysql_fetch_array($sql)){

$site_link = $row['site_link'];
$name_no = $row['name_no'];
$name_lat = $row['name_lat'];
$species_thumb = $row['species_thumb'];

if($count < $limit){
if($count == 0){
echo "<tr>";
}

echo"<td><a href='$site_link'><img src='/grafikk/$species_thumb' width='60' height='55' float='left'/></a>  <br/><a href='$site_link'> $name_no </a> <em>($name_lat)</em></td>";
}else{

$count = 0;
echo "</tr><tr><td><a href='$site_link'><img src='/grafikk/$species_thumb' width='60' height='55' float='left'/></a>  <br/><a href='$site_link'> $name_no </a> <em>($name_lat)</em></td></td>";
}
$count++;
}

echo"</tr></table>";

?>

Lenke til kommentar

 

Bare spør om du lurer på noe.

Du må oppdatere google api-keyen din :p

 

I alle :p Jeg har faktisk generert ny :tease:

 

On Topic:

header();

Kan ikke kalles etter at noe er output, det være seg HTML-kode, tomme linjer i en fil, eller fra PHP, så header("script-type: text/css"); må bort.

 

Jeg har sagt det før og sier det igjen, disse gamle php funksjonene må du slutte å bruke.

Jeg anbefaler deg å sette deg inn i MySQLi eller PDO nå, før du går noe videre.

 

:)

Lenke til kommentar

å ha en egen kolonne for "first-letter" virker meget redundant. Du kan jo bare gjøre en spørring som er sortert etter navnet for så å enten dele de opp i et array - eller bare oppdage det i printinga.

 

F.eks. følgende tabell:

CREATE TABLE frukt (
    id INTEGER NOT NULL,
    name VARCHAR(255),
    PRIMARY KEY(id)
hent ut frukt med følgende spørring:

SELECT * FROM frukt ORDER BY name;
Printing:

<?php
$alphas = range('A', 'Z');
$letter_num = 0;

printf("<h1>A</h1>");
while($row = mysql_fetch_assoc($result)){
    while($alphas[$letter_num]] != $row["name"][0]){
        printf("<h1>%s</h1>", $alphas[++$letter_num];
    }
    printf("%s<br>", $row["name"]);
}
?>
(Denne kan selvfølgelig forbedret med å bruke liste-elementer, og tilpassses etter behov)

 

Eksempel-output:

A
Apple
Avocado

B
Banana

C
D
Damson Plum
Endret av etse
Lenke til kommentar

Nå er det sånn at det finnes hundrevis av tutorials der ute hvor hundrevis av personer mener hundrevis av ulike ting og har hundrevis av ulike løsninger.

 

Jeg har ikke funnet opp php-koden min selv :)

 

Men den fungerer, og det er det viktigste for meg.

Takk for svar :)

Lenke til kommentar

Grunnen til at man sier man skal gå vekk i fra mysql_* funksjonene, er at de er gamle og er ikke lenger støttet/slutter å virke i PHP 5.5. Problemet med tutorials man finner på nettet er at de ikke blir oppdatert eller fjernet når de er utdaterte, derfor ser man at de fleste benytter mysql_* i stedet for mysqli_* eller pdo.

 

php ser veldig tungvint ut. jeg hadde funnet en ny jobb.

Hvis du ikke har noe å bidra med, så gå ett annet sted. Hvis du syntes dette ser tungvindt ut så syntes du programmering/skripting ser tungvindt ut. Dette er rimelig standard syntaks på tvers av de fleste språk (men noen få variasjoner). PHP sin syntaks er basert på C, og er dermed veldig lik alle andre programmeringsspråk som også er basert på C.
Lenke til kommentar

å ha en egen kolonne for "first-letter" virker meget redundant. Du kan jo bare gjøre en spørring som er sortert etter navnet for så å enten dele de opp i et array - eller bare oppdage det i printinga.

 

 

Egen bokstav-kolonne er neppe nødvendig, nei, og å kjøre en spørring pr. bokstav er heller ikke å anbefale, stemmer for etses forslag isteden.

Lenke til kommentar

Dere gjør ting utrolig vanskelig.

 

Koden kan gjøres så enkelt som følgende:

<?php
$current_letter = null;
foreach ($result as $fruit){
    $this_letter = substr($fruit, 0, 1);


    if ($this_letter != $current_letter) {
        echo '<h2>' . $this_letter . '</h2>';
        $current_letter = $this_letter;
    }
    
    echo '<p>' . $fruit . '</p>';
}
Endret av TheClown
  • Liker 1
Lenke til kommentar

Ser flere her bruke substr til å peke på første bokstav - jeg vil påstå det er litt dårlig måte å gjøre det på. Bruk heller array-notasjon, som helt fint fungerer på stringer i PHP. Dette vil lage mer lesbar kode, samt fort kan være raskere i tillegg.

 

Videre vil jeg si at jeg ikke er veldig fan av denne måten mange folk i PHP bruker echo for å skrive ut HTML - men dette er trolig en smakssak. Selv synes jeg printf er mye mer oversiktlig. Men den enkle printingen gjort her gjør det nesten ingen forskjell.

Lenke til kommentar
  • 3 uker senere...

Ser flere her bruke substr til å peke på første bokstav - jeg vil påstå det er litt dårlig måte å gjøre det på. Bruk heller array-notasjon, som helt fint fungerer på stringer i PHP. Dette vil lage mer lesbar kode, samt fort kan være raskere i tillegg.

 

Videre vil jeg si at jeg ikke er veldig fan av denne måten mange folk i PHP bruker echo for å skrive ut HTML - men dette er trolig en smakssak. Selv synes jeg printf er mye mer oversiktlig. Men den enkle printingen gjort her gjør det nesten ingen forskjell.

 

Var ikke en gang klar over at PHP hadde støtte for array-notasjon (eller string modification by character som det heter). Dette kom i PHP5 og er kanskje grunnen til at jeg aldri har hørt om det før.

 

At du foretrekker printf fremfor echo syntes jeg derimot er veldig rart. I PHP vil du i 9/10 tilfeller finne echo fremfor printf. Grunnen er vel i bunn og grunn at i et weaktyped-språk som PHP, som er printf-funksjonaliteten overflødig. Den tilbyr ikke noe mer enn det echo gjør. I andre (strong typed) språk, er den derimot veldig kjekk.

Lenke til kommentar

Det finner i det hele det samme til hvorfor jeg heller skriver følgende i python

print "{} * {} = {}".format(tall1, tall2, tall1*tall2)
fremfor dette:

print tall1, "*", tall2, "=", tall1*tall2
jeg synes rett og slett at når man skal ha strengutrykk som tar hensyn til litt flere variabler så er det mer ryddig og holde variablene utenfor selve print-statementet. Nå vet jeg PHP støtter at man skriver variablene direkte inn i stringen - men om det da står en plass i strengen "$usd" så er det ikke direkte intuitivt om de her henviser til variabelen $usd, eller om de faktisk ønsker å printe det som tekststreng. I tillegg kan man få litt issues fordi man brukte feil type tøddler.

 

Men jeg vil ikke påstå det er noe rett eller galt her eller at min metode egentlig er bedre. Jeg trives bare bedre med printf og synes det er mer ryddig og intuitivt. Og har i det minste noen grunner til det :)

Lenke til kommentar

... om det da står en plass i strengen "$usd" så er det ikke direkte intuitivt om de her henviser til variabelen $usd, eller om de faktisk ønsker å printe det som tekststreng. I tillegg kan man få litt issues fordi man brukte feil type tøddler.

Bare for å pirke litt, skal man være veldig korrekt så skal man omgi variabler med krøllparenteser når de er inne i en streng. Og det fungerer bare med " (double quote)

$var1 = 'World';

// dette vil fungere
echo "Hello $var1";

// dette er mer nøyaktig da det forteller php hvor variabelen begynner og slutter
// en god editor vil da også endre fargen til variabel fargen, som gjør det enda mer lesbart
echo "Hello {$var1}";

// dette fungerer ikke
echo 'Hello {$var1}';
echo 'Hello $var1';
Selv foretrekker jeg

echo 'Hello '.$var1;
da får man ikke problemet med ' eller "
Lenke til kommentar
Gjest Slettet-IHWlGMJn

Du spør om hvordan du gjør det i PHP og det har vel blitt besvart, men du vil nok egentlig la MySQL selv ta seg av dette:

SELECT SUBSTRING(name,1,1) AS first_letter, name FROM fruits ORDER BY first_letter, name
Lenke til kommentar
  • 4 uker senere...

Ser heller for meg at Web 2.0 / 3.0 løsningen vil være å sortere på klientsiden med java-script.

Dette er det ikke noe fastit på. Det har ulike fordeler og ulemper. SQL-databaser er ofte meget flinke på sortering - og med bruk av indekser kan de være utrolig raske. Og om man kjører slik logikk på klientsiden vil det slike prosessorkraft og eventuelt batteri hos brukeren. Og i disse mobildager er det litt greit å ha i tankene at om alle skal kjøre logikk på klientsiden vil det sluke masse strøm.
  • Liker 1
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...