PHP - sortering af HTML tabel

Tags:    php html

Hejsa!

Jeg er i øjeblikket i gang med at programmere en sorterings-funktion til min hjemmeside, freewaregames.dk.

Jeg har en tabel med spil, som skal sorteres efter alfabetisk rækkefølge.

Fold kodeboks ind/udPHP kode 


I toppen af mit dokument har jeg lavet en klasse kaldet, "spil". Heri har jeg skabt en funktion, der kan tilføje spil til tabellen ved hjælp af mine to variabler, $name og $filename.


Fold kodeboks ind/udPHP kode 


Problemet opstår når jeg prøver at sortere de forskellige instances med sort().

I min array kaldet $sorter, skal jeg bruge $name variablen fra min tidligere funktion. Hvordan får jeg fat i den?

Og hvordan får jeg det hele inkorporeret i tabellen?

Er der bedre måder at sortere tabellen på? Jeg kigger hovedsageligt efter løsninger, der er lette at opdatere.

Måske spørger jeg dumt - jeg er ny til PHP.

Tak!



9 svar postet i denne tråd vises herunder
6 indlæg har modtaget i alt 17 karma
Sorter efter stemmer Sorter efter dato
Du skal ikke lave en klasse bare fordi du kan. Din klasse/objekter skal have en berettigelse. Denne berettigelse beskrives af en række metoder i klassen.

Herunder er forslag til hvordan det kan se ud. Men objektdesign er en større videnskab for nye i faget, så du bør udforske den del også, for at forstå hvorfor objekter skal have hver deres funktion.

Fold kodeboks ind/udKode 


Ligeledes bør du altid skrive din kode for engelsksprogede. PHP's egne funktioner er i engelsk og ligeledes bør din være.



Indlæg senest redigeret d. 28.09.2012 16:56 af Bruger #10216
@Gustav, det er fint at du forholder dig til hvad du mener er det konkrete spørgsmål. Jeg mener dog at der ligger flere spørgsmål i samme indlæg som ret elementært kan besvares af et løsningsforslag der dækker bredt. En collection klasse løser mange af G. Sloths problemer, så som: inkorporering i output, bedre måder at sortere dataen på (serverside), og løsninger der er lette at vedligeholde.
Det er dog korrekt at udkastet af denne collection klasse ikke overholder mit eget fastsatte krav for hvad et object må gøre.

Men da det for os, er indlysende at G. Sloths kode ikke følger 100% god kodeskik, skader det ikke - som du selv er inde på - at skubbe i den rigtige retning.

Ligeledes er "__toString()" ikke de facto svaret(!), det samme gælder for eget forslag som de facto ikke er løsningen. :)

Du er selvfølgelig berettiget til at have en anden mening.



@Michael, jeg er helt på linje med dig.

Selvfølgelig er __toString ikke den eneste korrekte løsning, men det er den simpleste når man snakker om at sortere en liste af objekter. Ellers skulle man tage usort med en anonym funktion til at trække en property ud og bruge fx. strcmp.

Et collection objekt er en pænere løsning, men hvis du nu ville have at det skulle indholde objekter, så ville du jo være nød til at bruge __toString og sort eller usort. Så vores løsninger er ikke substituerbare, men kan faktisk kombineres med fordel.

@Gustav Sloth, $this->foo betyder at man peger på variablen foo i samme objekt som man arbejder i.

constructor funktionen bliver kørt når du instantierer objektet ($obj = new Spil()). Funktioner i PHP kan have "optional" argumenter - jeg kan ikke lige finde på et passende dansk ord, men det betyder at de ikke påkrævede. Se følgende eksempel:

Fold kodeboks ind/udPHP kode 


I vores constructor funktion, siger vi at argumenterne skal sættes til false hvis de ikke er givet. Med if-sætningerne siger vi så, at hvis argumenterne er givet, så sæt værdierne til de variable vi har i objektet.



Når du kalder din add method så skriver du output. Og så kan det ikke sorteres.

Fold kodeboks ind/udPHP kode 


Her laver vi et objekt, som har to variable (dem du havde som parametre for din add() funktion. De to variable kan sættes med obj->variabel eller via constructor funktionen som argument til new Spil.

Der er en funktion som laver dit output ved at bruge de to variable fra klassen og returnere en streng med det output du vil have. Det er din add funktion som er omskrevet.

__toString er en magic method, lige som __construct. Den bestemmer hvad der skal returneres hvis nogen forsøger at udskrive et objekt som en streng. Det udnytter vi til at sortere efter navn. Når du kalder sort på et array af objekter, så vil den bruge værdien fra __toString.

Hvis det skal være let at opdatere, så bør du kigge på databaser.

Håber det er nogen lunde forståeligt.



@Michael, jeg er helt enig i at designet ikke er helt smart. Men man skal jo starte et sted. At lave et collection objekt til den her slags er efter min mening ikke nødvendigvis meget smartere. Spørgsmålet handler i bund og grund bare om hvordan man kan sortere en liste af objekter, og til det spørgsmål, så er svaret __toString metoden.

@Ronny, det er smart at lave client side sorting, men det er ikke så meget det spørgsmålet går ud på.



Du kan ikke have mere end én return i en funktion. Hvis du vil sortere på flere parametre skal du kigge på http://php.net/usort

Hvis du vil lave en bedre løsning, så byg det på en database. Så kan du eksperimentere med OOP når du har styr på det.



jeg tror jeg ville sorterer clientside med http://tablesorter.com/docs/ , hvilke også giver brugeren mulighed for at ændre sorterings rækkefølge uden at kontakte serveren




Når du kalder din add method så skriver du output. Og så kan det ikke sorteres.

Fold kodeboks ind/udPHP kode 


Her laver vi et objekt, som har to variable (dem du havde som parametre for din add() funktion. De to variable kan sættes med obj->variabel eller via constructor funktionen som argument til new Spil.

Der er en funktion som laver dit output ved at bruge de to variable fra klassen og returnere en streng med det output du vil have. Det er din add funktion som er omskrevet.

__toString er en magic method, lige som __construct. Den bestemmer hvad der skal returneres hvis nogen forsøger at udskrive et objekt som en streng. Det udnytter vi til at sortere efter navn. Når du kalder sort på et array af objekter, så vil den bruge værdien fra __toString.

Hvis det skal være let at opdatere, så bør du kigge på databaser.

Håber det er nogen lunde forståeligt.


Mange tak for jeres svar.

Jeg må indrømme at jeg blev en kendelse forvirret.
Fold kodeboks ind/udPHP kode 



Hvad gør denne funktion helt præcist? Hvad er "name" for noget. Det er vel ikke en variabel når jeg der ikke er $ foran?

Jeg har heller aldrig set en if-sætning se sådan ud.

Jeg går ud fra at __construct bliver udført når objektet kaldes, eller hvad?

Beklager hvis jeg virker en anelse på bar grund. Jeg har prøvet google, men den gav ikke noget forståeligt resultat.

Jeg har umiddelbart svært ved at finde rundt i Michael Larsens kode. Jeg tror jeg skal bruge lidt tid til at slå de nye ting op.






Først og fremmest, mange tak for jeres svar.

Jeg har eksperimenteret en del. Jeg har ikke fået Michael Larsens kode til at virke. Den viser kun spillet "teeworlds".

Gustavs kode virker derimod fint, men jeg har svært ved at udbygge den således, at tabellen også kan sorteres efter andre parametre. Mit mål er også at kunne inddele spillene efter dato, genre og bedømmelse.

Jeg har lavet en løsning der delvist virker, men jeg har på fornemmelsen at den ikke er særlig smart.

Fold kodeboks ind/udPHP kode 


Her har jeg prøvet at vise alle spil, hvor genre-variablen er sat til "skyd". Den viser ganske rigtigt alle spil i skydespilsgenren. Jeg ønsker dog også at være i stand til at sortere skydespillene efter bedømmelse osv. Derfor har jeg lavet en ny array som jeg sorterer, men det ser ikke ud til at virke korrekt.

Jeg har lidt på fornemmelsen, at jeg er ude i en løsning, der ikke er særlig smart og ikke følger god kodeskik.

Håber jeg fik forklaret det optimalt.



t