Usort en UAsort

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Armaron

Armaron

15/04/2008 00:06:00
Quote Anchor link
Ik wil een array sorteren. De functie zit in een class FormWriter().

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?
function schrijf(){
  $gegevens = array("b","c","a");
  usort($gegevens,"sorteer");
}

function
sorteer($a,$b){
  return ($a > $b) ? -1 : 1 ;
}

?>


en ik krijg de fout:

Warning: usort() [function.usort]: Invalid comparison function in C:\wamp\www\Alumni\include\Utility.php on line 269
 
PHP hulp

PHP hulp

27/12/2024 18:12:08
 
- -

- -

15/04/2008 06:51:00
Quote Anchor link
Welke regel is regel 269?

Edit:
Je gebruikt letters in je array, maar je vergelijkt alsof ze integers zijn...
Gewijzigd op 01/01/1970 01:00:00 door - -
 
Jelmer -

Jelmer -

15/04/2008 08:28:00
Quote Anchor link
Probeer eens strcmp als functie bij usort mee te geven.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Armaron

Armaron

15/04/2008 14:16:00
Quote Anchor link
@Jonathan: regel 269 komt hier overeen met regel 4.
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.
 
Steen

steen

15/04/2008 15:07:00
Quote Anchor link
sort()? werkt die niet?
 
Jesper Diovo

Jesper Diovo

15/04/2008 15:31:00
Quote Anchor link
Zet $a en $b dan om naar ascii-codes en sorteer via deze. Bovendien heeft sort() ook nog een paar handige uitbreidingen waarmee je makkelijk tekst kunt sorteren.
 
Armaron

Armaron

15/04/2008 21:36:00
Quote Anchor link
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.
 
Jesper Diovo

Jesper Diovo

15/04/2008 21:39:00
Quote Anchor link
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.
 
Armaron

Armaron

15/04/2008 21:42:00
Quote Anchor link
Ik krijg nog steeds dezelfde fout en mijn functie is nu:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
function cmdSorteerFunctie($a,$b){
    return strcmp(strtolower($a->naam),strtolower($b->naam));
}

?>
 
Jesper Diovo

Jesper Diovo

15/04/2008 21:44:00
Quote Anchor link
Heb je wel naar de return values gekeken?
Quote:
Return Values

Returns < 0 if str1 is less than str2 ; > 0 if str1 is greater than str2 , and 0 if they are equal.
 
Armaron

Armaron

15/04/2008 21:52:00
Quote Anchor link
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.
 
Armaron

Armaron

15/04/2008 21:56:00
Quote Anchor link
Hieronder volgt mijn exacte code van mijn pagina:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
}
}

?>


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
 
Jesper Diovo

Jesper Diovo

15/04/2008 22:01:00
Quote Anchor link
Kun je ze dan niet gewoon vanuit de database ordenen? (ORDER BY ... ASC/DESC)
 
Jelmer -

Jelmer -

15/04/2008 22:22:00
Quote Anchor link
Ja, maar dat is geen function, dat is een method :) Een functie binnen een klasse! Geen probleem op zich, maar dan moet je ook even meegeven welke klasse hij moet pakken.

Voorbeeldje wanneer je een static method (denk aan functie met extra lange naam) gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class FormWriter {
    public function schrijf()
    {

        usort($functielist, array(__CLASS__, 'cmdSorteerFunctie'));
    }

    
    public static function cmdSorteerFunctie($a, $b)
    {

        // je kent het wel
    }
}

?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class FormWriter {
    public function schrijf()
    {

        usort($functielist, array($this, 'cmdSorteerFunctie'));
    }

    
    public function cmdSorteerFunctie($a, $b)
    {

        // weer...
    }
}

?>


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.
 
Armaron

Armaron

16/04/2008 13:57:00
Quote Anchor link
@Jelmer: dat zou moeten werken, ik zal dat vanavond uitproberen.

@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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
$functielijst
= $daFunctie->retrieveAll();
while($rij = mysql_fetch_object($functielijst,"Functie")){
  echo $functie->naam . "<br />";
}

?>


De output:

Programmeur
Analist
Netwerker
 
Armaron

Armaron

16/04/2008 17:50:00
Quote Anchor link
Heb het uitgetest. De oplossing van Jelmer werkt!

Extra:

zowel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
return strcmp(strtolower($a->naam),strtolower($b->naam));
?>


als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
if($a->naam == $b->naam){return 0;}
return ($a->naam > $b->naam) ? -1 : 1 ;
?>


zijn goede sorteer algoritmes om strings te sorteren.
Gewijzigd op 01/01/1970 01:00:00 door Armaron
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.