[php] multisort probleem

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
ik probeer op de volgende manier te sorteren:

PHP:
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
35
36
37
38
39
<?php
$standarray[$i]['team'] = $team['teamID'];
$standarray[$i]['punten'] = $punten;
$standarray[$i]['gespeeld'] = $gespeeldeWedstrijd;
$standarray[$i]['gewonnen'] = $gewonnen;
$standarray[$i]['gelijk'] = $gelijk;
$standarray[$i]['verloren'] = $verloren;
$standarray[$i]['dpvoor'] = $dpvoor;
$standarray[$i]['dptegen'] = $dptegen;
$standarray[$i]['doelsaldo'] = $dpvoor - $dptegen;

foreach ($standarray as $key => $row) {
   $punten[$key]  = $row['punten'];
   $gespeeld[$key] = $row['gespeeld'];
   $doelsaldo[$key] = $row['doelsaldo'];
   $dpvoor[$key] = $row['dpvoor'];
   $team[$key]  = $row['team'];
   $gewonnen[$key] = $row['gewonnen'];
   $gelijk[$key] = $row['gelijk'];
   $verloren[$key] = $row['verloren'];
   $dptegen[$key] = $row['dptegen'];          
}

array_multisort(
    $punten, SORT_DESC, 
    $gespeeld, SORT_ASC, 
    $doelsaldo, SORT_DESC, 
    $dpvoor, SORT_DESC, 
    $team,
    $gewonnen,
    $gelijk,
    $verloren,
    $dptegen,
    $standarray);
echo "<pre>";
print_r($standarray);
echo "</pre>";

?>


de $i die je ziet verhoogt zichzelf en begint bij 0.

Op een of andere manier wordt er helemaal niet gesorteerd. wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
De code ziet er wel goed uit. Kun je een voorbeeld geven waarbij die $standarray expliciet geïnitialiseerd wordt (zodat we precies kunnen zien wat er in zit) en waarbij je de uitvoer van print_r($standarray) ook weergeeft? Nu blijft het gissen met wat voor data je precies werkt (en of de invoer misschien al gesorteerd is, bijvoorbeeld).

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Misschien ben ik gek, maar je deelt je hoofdarray eerst op in allerlei kleine arrays, bijvoorbeeld een met alle punten. Vervolgens pak je alle arrays die je hebt, en sorteer je ze vervolgens via array_multisort(). Je vertelt php alleen nergens dat ie met al die kleine arrays ook weer iets moet doen zodat ze allemaal in de juiste grote array terecht komen, en goed gesorteerd.

// Edit:
Even een voorbeeld:
code:
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
35
36
37
38
39
40
41
Array
(
    [0] => Array
        (
            [team] => 1
            [punten] => 4
            [gespeeld] => 3
            [gewonnen] => 1
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 6
            [dptegen] => 5
            [doelsaldo] => 1
        )

    [1] => Array
        (
            [team] => 21
            [punten] => 1
            [gespeeld] => 2
            [gewonnen] => 0
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 2
            [dptegen] => 4
            [doelsaldo] => -2
        )

    [2] => Array
        (
            [team] => 20
            [punten] => 3
            [gespeeld] => 1
            [gewonnen] => 1
            [gelijk] => 0
            [verloren] => 0
            [dpvoor] => 3
            [dptegen] => 2
            [doelsaldo] => 1
        )
)

Nu heb ik hierboven dus mn array. Wat jij momenteel doet, is $papa opbreken in een array met punten, een array met gespeeld, een array met gewonnen, etc.. Vervolgens verwacht je dat array_multisort() de subarrays sorteert en meteen weer aan mekaar plakt. Zo werkt het natuurlijk niet.
Wat je na je sort hebt, is dit:
code:
1
2
3
4
5
6
7
Array ($punten)
(
    [1] => 4
    [2] => 1
    [3] => 3
)
En voor de rest ook..

[ Voor 81% gewijzigd door MueR op 27-11-2006 22:13 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
inhoud van de array voor de sort:

code:
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
35
36
37
38
39
40
41
42
Array
(
    [0] => Array
        (
            [team] => 1
            [punten] => 4
            [gespeeld] => 3
            [gewonnen] => 1
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 6
            [dptegen] => 5
            [doelsaldo] => 1
        )

    [1] => Array
        (
            [team] => 21
            [punten] => 1
            [gespeeld] => 2
            [gewonnen] => 0
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 2
            [dptegen] => 4
            [doelsaldo] => -2
        )

    [2] => Array
        (
            [team] => 20
            [punten] => 3
            [gespeeld] => 1
            [gewonnen] => 1
            [gelijk] => 0
            [verloren] => 0
            [dpvoor] => 3
            [dptegen] => 2
            [doelsaldo] => 1
        )

)


De inhoud is na de sort exact hetzelfde

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
Oke ik snap je punt. Ik heb de multisort zo van: http://nl3.php.net/manual/en/function.array-multisort.php

Hoe plak ik deze arrays dan weer aan elkaar zonder de boel door elkaar te husselen?
PHP:
1
2
3
4
5
<?php
echo "<pre>";
print_r($punten);
echo "</pre>";
?>

resulteerd in:
code:
1
3

???
PHP:
1
2
3
4
5
<?php
echo "<pre>";
print_r($teams);
echo "</pre>";
?>

resulteerd in:
code:
1
2
3
4
5
6
Array
(
    [0] => 1
    [1] => 21
    [2] => 20
)

[ Voor 31% gewijzigd door rewind. op 27-11-2006 22:21 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
MueR schreef op maandag 27 november 2006 @ 22:06:
Misschien ben ik gek, maar je deelt je hoofdarray eerst op in allerlei kleine arrays, bijvoorbeeld een met alle punten.
[..]
Vervolgens verwacht je dat array_multisort() de subarrays sorteert en meteen weer aan mekaar plakt. Zo werkt het natuurlijk niet.
Fout, zo werkt het wel. Merk op dat $standarray ook het laatste argument aan array_multisort() is en dus meegesorteerd wordt!
Stoney187 schreef op maandag 27 november 2006 @ 22:10:
inhoud van de array voor de sort:
<knip>
Als ik deze array als invoer gebruik, is het resultaat:
Array
(
    [0] => Array
        (
            [team] => 1
            [punten] => 4
            [gespeeld] => 3
            [gewonnen] => 1
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 6
            [dptegen] => 5
            [doelsaldo] => 1
        )

    [1] => Array
        (
            [team] => 20
            [punten] => 3
            [gespeeld] => 1
            [gewonnen] => 1
            [gelijk] => 0
            [verloren] => 0
            [dpvoor] => 3
            [dptegen] => 2
            [doelsaldo] => 1
        )

    [2] => Array
        (
            [team] => 21
            [punten] => 1
            [gespeeld] => 2
            [gewonnen] => 0
            [gelijk] => 1
            [verloren] => 1
            [dpvoor] => 2
            [dptegen] => 4
            [doelsaldo] => -2
        )

)

Precies wat je wilde (of niet?).

[ Voor 52% gewijzigd door Soultaker op 27-11-2006 22:24 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Soultaker schreef op maandag 27 november 2006 @ 22:20:
Fout, zo werkt het wel. Merk op dat $standarray ook het laatste argument aan array_multisort() is en dus meegesorteerd wordt!
Meegesorteerd wel, maar niet op alle argumenten in de volgorde die TS opgeeft. Hij geeft een hele rits arrays op om te sorteren, en multisort doet dat netjes. Multisort snapt alleen niet zo goed dat TS wil dat van al die arrays weer ook een grote array wordt gemaakt, daar is multisort namelijk niet voor. Klinkt meer als iets voor array_merge_recursvie().

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
MueR schreef op maandag 27 november 2006 @ 22:23:
[...]

Meegesorteerd wel, maar niet op alle argumenten in de volgorde die TS opgeeft. Hij geeft een hele rits arrays op om te sorteren, en multisort doet dat netjes. Multisort snapt alleen niet zo goed dat TS wil dat van al die arrays weer ook een grote array wordt gemaakt, daar is multisort namelijk niet voor. Klinkt meer als iets voor array_merge_recursvie().
Sorry MueR, ik wil niet lomp overkomen, maar als je niet weet wat array_multisort() doet waarom reageer je dan? Je maakt de discussie alleen maar rommeliger. Lees alsjeblieft eerst de PHP manual over die functie eens door!

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
Soultaker.. dat is precies wat ik wil.. waar kan het fout gaan?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Moeilijk te zeggen... hoe initialiseer jij je $standarray precies? Test ook eens door de gegeven array er in te hardcoden:
PHP:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
$standarray = Array
(
    0 => Array
        (
            "team" => 1,
            "punten" => 4,
            "gespeeld" => 3,
            "gewonnen" => 1,
            "gelijk" => 1,
            "verloren" => 1,
            "dpvoor" => 6,
            "dptegen" => 5,
            "doelsaldo" => 1
        ),

    1 => Array
        (
            "team" => 21,
            "punten" => 1,
            "gespeeld" => 2,
            "gewonnen" => 0,
            "gelijk" => 1,
            "verloren" => 1,
            "dpvoor" => 2,
            "dptegen" => 4,
            "doelsaldo" => -2
        ),

    2 => Array
        (
            "team" => 20,
            "punten" => 3,
            "gespeeld" => 1,
            "gewonnen" => 1,
            "gelijk" => 0,
            "verloren" => 0,
            "dpvoor" => 3,
            "dptegen" => 2,
            "doelsaldo" => 1
        )
);

foreach ($standarray as $key => $row) {
   $punten[$key]  = $row['punten'];
   $gespeeld[$key] = $row['gespeeld'];
   $doelsaldo[$key] = $row['doelsaldo'];
   $dpvoor[$key] = $row['dpvoor'];
   $team[$key]  = $row['team'];
   $gewonnen[$key] = $row['gewonnen'];
   $gelijk[$key] = $row['gelijk'];
   $verloren[$key] = $row['verloren'];
   $dptegen[$key] = $row['dptegen'];
}

array_multisort(
    $punten, SORT_DESC,
    $gespeeld, SORT_ASC,
    $doelsaldo, SORT_DESC,
    $dpvoor, SORT_DESC,
    $team,
    $gewonnen,
    $gelijk,
    $verloren,
    $dptegen,
    $standarray);
echo "<pre>";
print_r($standarray);
echo "</pre>";

Zo testte ik ook namelijk. Geeft dit bij jou niet het goede resultaat dan is er misschien iets raars met je PHP installatie (oude versie ofzo?).

Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
met jou testfile werkt het!

hier mijn code (let nog even niet op de foute query's):
PHP:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
$i=0;
$sqlteams = mysql_query("SELECT * FROM teams WHERE compID = ".$_POST['comp'].";");
while ($team = mysql_fetch_array($sqlteams)) {
    //echo "<h2>".$team['name']."</h2>";
    $gespeeldeWedstrijd = 0;
    $punten = 0;
    $verloren = 0;
    $gewonnen = 0;
    $gelijk = 0;
    $dpvoor = 0;
    $dptegen = 0;
    $sqlwedstrijden = mysql_query("SELECT * FROM wedstrijden WHERE teamThuisID = ".$team['teamID']." OR teamUitID = ".$team['teamID']."");
    while ($wedstrijd = mysql_fetch_array($sqlwedstrijden)) {
            
            if($wedstrijd['teamThuisID'] == $team['teamID']) {
                if($wedstrijd['goalsThuis'] > $wedstrijd['goalsUit']) {
                    $punten = $punten + 3;
                    $gewonnen = $gewonnen + 1;
                } else if($wedstrijd['goalsThuis'] == $wedstrijd['goalsUit']) {
                    $punten = $punten + 1;
                    $gelijk = $gelijk + 1;
                } else {
                    $verloren = $verloren + 1;
                }
                $dpvoor = $dpvoor + $wedstrijd['goalsThuis'];
                $dptegen = $dptegen + $wedstrijd['goalsUit'];
            } else {
                if($wedstrijd['goalsThuis'] > $wedstrijd['goalsUit']) {
                    $verloren = $verloren + 1;
                } else if($wedstrijd['goalsThuis'] == $wedstrijd['goalsUit']) {
                    $punten = $punten + 1;
                    $gelijk = $gelijk + 1;
                } else {
                    $punten = $punten + 3;
                    $gewonnen = $gewonnen + 1;
                }
                $dpvoor = $dpvoor + $wedstrijd['goalsUit'];
                $dptegen = $dptegen + $wedstrijd['goalsThuis'];
            }
            $gespeeldeWedstrijd++;  
    }
    $standarray[$i]['team'] = $team['teamID'];
    $standarray[$i]['punten'] = $punten;
    $standarray[$i]['gespeeld'] = $gespeeldeWedstrijd;
    $standarray[$i]['gewonnen'] = $gewonnen;
    $standarray[$i]['gelijk'] = $gelijk;
    $standarray[$i]['verloren'] = $verloren;
    $standarray[$i]['dpvoor'] = $dpvoor;
    $standarray[$i]['dptegen'] = $dptegen;
    $standarray[$i]['doelsaldo'] = $dpvoor - $dptegen;
    
    $i++;
}

echo "<pre>";
print_r($standarray);
echo "</pre>";

foreach ($standarray as $key => $row) {
   $punten[$key]  = $row['punten'];
   $gespeeld[$key] = $row['gespeeld'];
   $doelsaldo[$key] = $row['doelsaldo'];
   $dpvoor[$key] = $row['dpvoor'];
   $team[$key]  = $row['team'];
   $gewonnen[$key] = $row['gewonnen'];
   $gelijk[$key] = $row['gelijk'];
   $verloren[$key] = $row['verloren'];
   $dptegen[$key] = $row['dptegen'];          
}

array_multisort(
    $punten, SORT_DESC, 
    $gespeeld, SORT_ASC, 
    $doelsaldo, SORT_DESC, 
    $dpvoor, SORT_DESC, 
    $team,
    $gewonnen,
    $gelijk,
    $verloren,
    $dptegen,
    $standarray);
echo "<pre>";
print_r($standarray);
echo "</pre>";

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

een alternatief:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
usort($standarray, 'sortStanden');

function sortStanden($a, $b)
{
    // descending
    if ($a['punten'] != $b['punten'])
        return $b['punten'] - $a['punten'];

    // ascending
    if ($a['gespeeld'] != $b['gespeeld'])
        return $a['gespeeld'] - $b['gespeeld'];

    // descending
    if ($a['doelsaldo'] != $b['doelsaldo'])
        return $b['doelsaldo'] - $a['doelsaldo'];

    // descending
    return $b['dpvoor'] - $a['dpvoor'];
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • rewind.
  • Registratie: Oktober 2001
  • Laatst online: 17-09 11:00
Met de uitwerking van crisp krijg ik in mijn testversie een goede array terug maar in de applicatie zelf veranderd er weer niets! Het zit dus toch in de opbouw van de array.

//edit

ik heb het inmiddels aan de praat!

Het lag aan een if statement!

[ Voor 18% gewijzigd door rewind. op 27-11-2006 23:43 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Nou, debuggen dan! Wat gebeurt er met die andere arrays? Worden die wel gesorteerd en wat zit daar in?

[ Voor 10% gewijzigd door Soultaker op 27-11-2006 23:43 ]

Pagina: 1