[RESOLU] SplHeap extrait d'abord le premier résultat inséré

Eléphant du PHP | 65 Messages

13 févr. 2017, 19:53

Bonsoir,
Je suis sous PHP 7.1 et je pense avoir découvert un bug, pouvez-vous me donner votre avis ?

Code : Tout sélectionner

class myHeap extends SplHeap{ public function compare(){} } $myHeap = new myHeap; $myHeap->insert('A'); $myHeap->insert('B'); $myHeap->insert('C'); $myHeap->insert('D'); var_dump($myHeap->extract(),$myHeap->extract(),$myHeap->extract(),$myHeap->extract()); // A D C B
SplHeap est sensé se comporter comme un tas, pourquoi il extrait d'abord A ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

14 févr. 2017, 10:38

Bonjour,

Je n'ai jamais utilisé SplHeap mais à première vue je dirai qu'un tas est différent d'une pile, c'est pas plutôt SplStack qu'il faudrait que tu utilises pour avoir le résultat attendu ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 65 Messages

14 févr. 2017, 12:22

Salut,
En fait j'ai compris mon erreur, elle provenait de la fonction compare() que je pensais optionnelle pour me servir de la classe comme un simple tas - je voulais m'en servir pour faire un task runner -.
Je post quand même la solution:

Code : Tout sélectionner

class myHeap extends SplHeap{ public function compare($a,$b){ if($a === $b): return 0; endif; return $a < $b ? -1 : 1; } }
Quant à la classe SplStack elle n'a pas la même fonction, c'est plutôt un itérateur qui sert à utiliser un objet comme un tableau (d'où son implémentation de l'interface ArrayAccess).