[PHP] Tabel op meerdere dingen sorteren

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mtlife
  • Registratie: Maart 2004
  • Laatst online: 18-10-2024
Ik probeer een tabel te sorteren op meerdere dingen tegelijk. Om even een simpel voorbeeld te geven, net zoals in de eredivisie zeg maar. Eerst wordt gesorteerd op punten, dan op doelsaldo mochten er evenveel punten zijn en daarna op weet ik veel wat (meeste doelpunten gescoord ofzo?).

Ik heb in php een tabel opgeslagen in een multiple array, dus
PHP:
1
$tabel['eersterij'] = array("naam1"=>"waarde1","naam2"=>"waarde2");


deze tabel krijg ik wel op 1 ding gesorteerd.. maar niet op meerdere dingen zoals hierboven beschreven. Op dit moment sorteer ik de array (keys moeten wel bewaard blijven) met msort (code afkomstig van http://nl3.php.net/manual/en/function.sort.php ):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function msort($array, $id="id") {
        $temp_array = array();
        while(count($array)>0) {
            $lowest_id = 0;
            $index=0;
            foreach ($array as $item) {
                if (isset($item[$id]) && $array[$lowest_id][$id]) {
                    if ($item[$id]<$array[$lowest_id][$id]) {
                        $lowest_id = $index;
                    }
                }
                $index++;
            }
            $temp_array[] = $array[$lowest_id];
            $array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
        }
        return $temp_array;
    }


is er een makkelijke manier om de tabel te sorteren, of moet ik met een andere benadering aan de slag?

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
waarom doe je dat sorteren niet regelen in je query?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • mtlife
  • Registratie: Maart 2004
  • Laatst online: 18-10-2024
nou omdat de query die ik uitvoer zeg maar bestaat uit een resultaat van 20 of meer rijen, verdeeld over een paar gebruikers voeg ik eerst die resultaten per gebruiker met php bij elkaar.

Kan ik mooi weer eredivisie erbij pakken: stel je tabel voor met alle wedstrijden van de eredivisie.. Query haalt alle wedstrijdresultaten op. Met php winst of verlies uitrekenen,mooi punten opgetellen en doelpunten onderbrengen bij de teams met while en foreach loopjes etc.. dat nu nog mooi gesorteerd in een tabel!

Acties:
  • 0 Henk 'm!

  • stappel_
  • Registratie: Augustus 2000
  • Laatst online: 20:41
je moet eerst op waarde2 sorteren en dan die lijst daarna op waarde1 sorteren. dat klinkt niet logisch maar het werkt wel. doordat de lijst na de eerste sort als een volgorde heeft werkt dat door in de 2e sort.

zo kan je ook kleine getallen makkelijk sorteren. doe het maar eens met de siske en wiske boeken. die hebben een 3 cijferig nummer. maak eerst stapels van 0,1,2,3...9 op het laatste getal. leg dan alle stapels weer op elkaar onderop de 9-ens, dan de 8, etc. en sorteer op het tweede getal, etc. en dan het eerste getal (de honderdtallen). met 3 cijfers heb je een 3N sort. best snel soms.

Ubero: #2, Euler: #1, GOT: #1, Des: #1, Zeta: #1, Eon: #3, OGR-24: #3, OGR-25: #7,
LM: #7, AP: #5, DF: #19, D2OL: #37, SOB: #50, TSC: #63, RC5: #96


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

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
function puntenSort($a, $b)
{
    $returnValue = $b['punten'] - $a['punten'];

    if ($returnValue == 0)
        $returnValue = $b['doelsaldo'] - $a['doelsaldo'];
    
    return $returnValue;
}

$tabel = array(
    'ajax'  => array(
            'punten' => 20,
            'doelsaldo' => 10
        ),
    'psv'   => array(
            'punten' => 30,
            'doelsaldo' => 15
        ),
    'az'    => array(
            'punten' => 30,
            'doelsaldo' => 17
        ),
);

uasort($tabel, 'puntenSort');
print_r($tabel);


:)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • mtlife
  • Registratie: Maart 2004
  • Laatst online: 18-10-2024
stappel_ schreef op donderdag 31 mei 2007 @ 08:14:
je moet eerst op waarde2 sorteren en dan die lijst daarna op waarde1 sorteren. dat klinkt niet logisch maar het werkt wel. doordat de lijst na de eerste sort als een volgorde heeft werkt dat door in de 2e sort.

zo kan je ook kleine getallen makkelijk sorteren. doe het maar eens met de siske en wiske boeken. die hebben een 3 cijferig nummer. maak eerst stapels van 0,1,2,3...9 op het laatste getal. leg dan alle stapels weer op elkaar onderop de 9-ens, dan de 8, etc. en sorteer op het tweede getal, etc. en dan het eerste getal (de honderdtallen). met 3 cijfers heb je een 3N sort. best snel soms.
dit werkt natuurlijk, dom dat ik daar niet aan heb gedacht...
crisp schreef op donderdag 31 mei 2007 @ 08:29:
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
function puntenSort($a, $b)
{
    $returnValue = $b['punten'] - $a['punten'];

    if ($returnValue == 0)
        $returnValue = $b['doelsaldo'] - $a['doelsaldo'];
    
    return $returnValue;
}

$tabel = array(
    'ajax'  => array(
            'punten' => 20,
            'doelsaldo' => 10
        ),
    'psv'   => array(
            'punten' => 30,
            'doelsaldo' => 15
        ),
    'az'    => array(
            'punten' => 30,
            'doelsaldo' => 17
        ),
);

uasort($tabel, 'puntenSort');
print_r($tabel);


:)
maar ik vind dit een veel schonere en nettere oplossing :D. Kan deze ook wel aanpassen zodat er nog een waarde rekening mee wordt gehouden.

Acties:
  • 0 Henk 'm!

  • mtlife
  • Registratie: Maart 2004
  • Laatst online: 18-10-2024
ok ik stuit nu op klein probleempje, kan ik makkelijk omheen maar toch ff vragen waarom het gebeurt:
met uasort (en ook met msort) krijg je een lege array in je multidimensional array.. dit bedoel ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array ( 
    [2] => Array ( 
        [points] => 6 
        [goalbalance] => 5 
        [id] => 2 ) 
    [1] => Array ( 
        [points] => 6 
        [goalbalance] => 3 
        [id] => 1 ) 
    [3] => Array ( 
        [points] => 1 
        [goalbalance] => -1 
        [id] => 3 ) 
    [0] => Array ( ) 
    [5] => Array ( 
        [sd] => 0 [points] => 0 
        [goalbalance] => -7 
        [id] => 5 ) 
    )

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Zit die lege niet al in je source array?

petersmit.eu


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Vergelijk je ook op de sd key die ik in de array met ID 5 terugvind? Want dan kan het zijn dat er een lege key wordt gemaakt om ergens mee te kunnen vergelijken.

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • mtlife
  • Registratie: Maart 2004
  • Laatst online: 18-10-2024
phsmit schreef op donderdag 31 mei 2007 @ 12:33:
Zit die lege niet al in je source array?
hij zat idd in me source array, erin geslopen denk ik toen ik begon met de tabel :).. er nu uitgehaald, maar ik laat de beveiliging er nu lekker in zitten voor als het er nog een keer insluipt. bedankt voor de hulp!
--MeAngry-- schreef op donderdag 31 mei 2007 @ 12:35:
Vergelijk je ook op de sd key die ik in de array met ID 5 terugvind? Want dan kan het zijn dat er een lege key wordt gemaakt om ergens mee te kunnen vergelijken.
neej daar vergelijk ik niet mee :) tis al opgelost zoals je leest.

[ Voor 32% gewijzigd door mtlife op 31-05-2007 12:51 ]

Pagina: 1