Usort en UAsort
De functie die ik aanmaak is om een formulier standaard weg te kunnen schrijven. Daarin moet ik wat gegevens sorteren. De functie die er vlak na komt is de sorteer functie. Dus nu staat er:
Code (php)
en ik krijg de fout:
Warning: usort() [function.usort]: Invalid comparison function in C:\wamp\www\Alumni\include\Utility.php on line 269
Edit:
Je gebruikt letters in je array, maar je vergelijkt alsof ze integers zijn...
Gewijzigd op 01/01/1970 01:00:00 door - -
Ik heb die regel gecopieerd van een functie waar ik hetzelfde doe, enkel niet in een class. Maar daar werkt het wel. Ik heb van die pagina (waar het werkt) de code gecopieerd omdat ik weet dat het daar de sort doet zoals ik wil.
@Jelmer: heb ik al geprobeerd, samen met een string vergelijk functie gevonden bij uasort() functie beschrijving (het eerste voorbeeld). Maar dat werkt niet. Mijn vergelijking werkt op een andere pagina.
Op de werkende pagina, de usort staat niet in een function maar wordt gewoon uitgevoerd telkens de pagina laad. Ik heb de sorteer functie al uitgetest en die werkt.
sort()? werkt die niet?
sort() ook nog een paar handige uitbreidingen waarmee je makkelijk tekst kunt sorteren.
Zet $a en $b dan om naar ascii-codes en sorteer via deze. Bovendien heeft Ja, maar in mijn array steken namelijk geen tekstvelden, maar objecten. :) En dan werkt sort niet meer. In die objecten steekt namelijk een mix van getallen, tekst en datums.
Zo, zo. De getallen en tekst kun je alsnog op mijn manier behandelen. ASCII-codes zijn er tenslotte ook voor getallen. Data kun je gewoon zo vergelijken.
Code (php)
1
2
3
4
5
2
3
4
5
<?
function cmdSorteerFunctie($a,$b){
return strcmp(strtolower($a->naam),strtolower($b->naam));
}
?>
function cmdSorteerFunctie($a,$b){
return strcmp(strtolower($a->naam),strtolower($b->naam));
}
?>
Quote:
Return Values
Returns < 0 if str1 is less than str2 ; > 0 if str1 is greater than str2 , and 0 if they are equal.
Returns < 0 if str1 is less than str2 ; > 0 if str1 is greater than str2 , and 0 if they are equal.
Ja, dat heb ik eerst gedaan voor ik mijn oude statement verving. Ik krijg enkel -1, 0 en 1. Met 5 verschillende strings getest. Hoofd en kleine letters etc.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
class FormWriter(){
function schrijf(){
if(!empty($functielijst)){
usort($functielijst, "cmdSorteerFunctie");
}
}
function cmdSorteerFunctie($a,$b){
return strcmp(strtolower($a->naam),strtolower($b->naam));
}
}
?>
class FormWriter(){
function schrijf(){
if(!empty($functielijst)){
usort($functielijst, "cmdSorteerFunctie");
}
}
function cmdSorteerFunctie($a,$b){
return strcmp(strtolower($a->naam),strtolower($b->naam));
}
}
?>
Dit is een print van wat $a->naam of $b->naam kan zijn:
Programmeur
Analist
Netwerker
In die volgorde komt het ook in de database voor.
Gewijzigd op 01/01/1970 01:00:00 door Armaron
Kun je ze dan niet gewoon vanuit de database ordenen? (ORDER BY ... ASC/DESC)
Voorbeeldje wanneer je een static method (denk aan functie met extra lange naam) gebruikt:
Code (php)
Of wanneer cmdSorteerFunctie een method is, in de context van je instantie (wat dus betekent dat het een functie is waar $this beschikbaar is)
Code (php)
In jouw context kan je prima het eerste voorbeeld gebruiken, omdat de sorteerfunctie niet verbonden is met de context van het object. Een lambda-functie, of een anonymous functie zoals die in Javascript en Python voorkomen zou helemaal ideaal zijn, maar die trucjes biedt PHP nog niet.
@Djemo: Nee, dat gaat niet. Ik heb voor alle tabellen in mijn database een data access klasse gemaakt. En voor elke classe heb ik abstracte create, update, delete, retrieveById, retrieveAll functies geschreven. Ik kan er geen ORDER BY doen, want niet elke tabel heeft hetzelfde veld waarom gesorteerd moet worden.
Ter verduidelijking:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
$functielijst = $daFunctie->retrieveAll();
while($rij = mysql_fetch_object($functielijst,"Functie")){
echo $functie->naam . "<br />";
}
?>
$functielijst = $daFunctie->retrieveAll();
while($rij = mysql_fetch_object($functielijst,"Functie")){
echo $functie->naam . "<br />";
}
?>
De output:
Programmeur
Analist
Netwerker
Extra:
zowel
als
zijn goede sorteer algoritmes om strings te sorteren.
Gewijzigd op 01/01/1970 01:00:00 door Armaron