Versio

array sorteren op object property

Overzicht Reageren

Nicoow Unknown

Nicoow Unknown

15/06/2009 15:46:00
Quote Anchor link
Hallo allen,
ik ben nog steeds bezig met mijn cardGames class, maar nu wil ik mijn lijst met kaarten selecteren op object property.
Nu kan ik hier nergens een functie voor vinden, en zelf lukt het mij ook niet,,
(hij word gesorteerd naar:
7
6
8
8
9
A
Q
)
Dit is dus niet helemaal goed volgens mij.
Hij is gewoon exact hetzelfde als hij al was.
Heeft iemand enig idee hoe ik dit wel voor elkaar kan krijgen?

Dit is de code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
function sortObject($object, $key)
    {

        for ($i = count($object) - 1; $i >= 0; $i--) {
            $swapped = false;
            for ($j = 0; $j < $i; $j++) {
                switch ($object) {
                    case
$object[$i]->$key == 'J':
                        $value = '11';
                    case
$object[$i]->$key == 'Q':
                        $value = '12';
                    case
$object[$i]->$key == 'K':
                        $value = '13';
                    case
$object[$i]->$key == 'A':
                        $value = '14';
                    default:

                        $value = $object[$i]->$key;
                }

                if ($value < $object[$j + 1]->$key) {
                    $tmp = $object[$j];
                    $object[$j] = $object[$j + 1];
                    $object[$j + 1] = $tmp;
                    $swapped = true;
                }
            }

            return $object;
        }
    }

?>


Gegroet
 
PHP hulp

PHP hulp

23/05/2012 21:44:46
Gesponsorde koppelingen:
 
Joren de Wit
Beheerder

Joren de Wit

15/06/2009 15:54:00
Quote Anchor link
Dat komt waarschijnlijk omdat je maar 1x door alle kaarten heel loopt. Je zou eigenlijk na elke 'swap' de loop weer opnieuw moeten beginnen (dus $i en $j moeten resetten).
 
Nicoow Unknown

Nicoow Unknown

15/06/2009 15:59:00
Quote Anchor link
maar door die 2 for loops zou hij het toch goed moeten doen?
 
Joren de Wit
Beheerder

Joren de Wit

15/06/2009 16:06:00
Quote Anchor link
Ja, maar het kan best zijn dat een derde entry ook groter is dan de eerste entry en daar dus voor moet komen. In jouw script gebeurt dat nu niet.

Neem bijvoorbeeld de reeks [6 7 6 8]. In 1 iteratie zou dat achter eenvolgens de volgende volgordes opleveren: [7 6 6 8] en uiteindelijk [7 6 8 6]. Maar zoals je ziet klopt dit niet, aangezien die 8 nog twee plaatsen verder omhoog moet. Dit krijg je alleen voor elkaar als je nog twee keer door dezelfde reeks heen loopt: [7 8 6 6] en dan nogmaals voor: [8 7 6 6].

ps. Wellicht dat je dit nog veel makkelijker met een array en een van de bijbehorende sort() functies kunt bereiken. De objecten vormen dan de waarden in een array en de hoogte van de kaart zet je in de bijbehorende keys. Sorteer op basis van de keys en lees vervolgens je objecten in de goede volgorde uit.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Jelmer rrrr

Jelmer rrrr

15/06/2009 16:10:00
Quote Anchor link
Je kan eens kijken naar usort. Daarmee laat je PHP sorteren regelen (PHP beslist voor je wat er geswapped gaat worden, en welke elementen vergeleken moeten worden) en het enige wat jij hoeft mee te geven is een vergelijk-functie die de twee elementen die PHP erin stopt met elkaar vergelijkt.

(ik neem aan dat PHP intern het quicksort algoritme gebruikt, wat sneller is dan jouw, zoals Blachne al zei onvolledige, algoritme)
 
Nicoow Unknown

Nicoow Unknown

15/06/2009 17:01:00
Quote Anchor link
Ik probeer het nu met usort(), maar hij werkt nog steeds niet zoals ik wil.
Ik heb dus een functie geschreven die het moet gaan sorteren.
Maar hij pakt de A, K, Q, J niet goed.
Iemand nog een idee?
dit is de functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
static function cmp_value($a, $b)
    {

        switch ($a->value) {
                case
'J':
                    $al = 11;
                case
'Q':
                    $al = 12;
                case
'K':
                    $al = 13;
                case
'A':
                    $al = 14;
                default:

                    $al = $a->value;
        }

        
        switch ($b->value) {
                case
'J':
                    $bl = 11;
                case
'Q':
                    $bl = 12;
                case
'K':
                    $bl = 13;
                case
'A':
                    $bl = 14;
                default:

                    $bl = $b->value;
        }

        if ($al == $bl) {
            return 0;
        }

        return ($al > $bl) ? +1 : -1;
    }

?>


forget it,, breaks vergeten
Gewijzigd op 01/01/1970 01:00:00 door Nicoow Unknown
 



Overzicht Reageren

Get Adobe Flash player