[PHP] MultiDimensional Array sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
Ja, dit is het zoveelste topic over het sorteren van een array met PHP, maar dit keer is het wel heel anders. Ik heb gezocht op PHP.net en ook heel P&W doorzocht, maar ik kon niets vinden waarmee ik verder kon komen.

ok, Ik heb een array met members (ID is het mailadres)
en daarin weer de gegevens van dat member.
hier dan de array:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array:
{
    ['Email@adres1.nl'] = Array:
                          {
                              ['name'] = 'naampje'
                              ['team'] = 'teampje'
                              ['score'] = 3333,3
                          }
    ['Email@adres2.nl'] = Array:
                          {
                              ['name'] = 'naampje'
                              ['team'] = 'teampje'
                              ['score'] = 3334,3
                          }
    enz...
}
Het volgende heb ik geprobeerd:
PHP:
1
2
3
4
5
6
7
8
9
10
  function cmp($a, $b)
  {
    if ($a['score'] == $b['score'])
    {
      return 0;
    }
    return ($a['score'] < $b['score']) ? -1 : 1;
  }

  uksort($tmp, "cmp");
Ook heb ik uasort en usort geprobeerd, maar ik krijg steeds een zelfde foutmelding:
Warning: Wrong datatype in uksort()
Ik zi echt niet wat ik fout doe.
Kan iemand me hier mee helpen?

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP:
1
2
3
4
5
6
7
8
<?php
foreach ($MultiArray as $Key => $Value)
{
       $Value = aSort ($Value);
       $MultiArray[$Key] = $Value;
}
$MultiArray = aSort ($MultiArray);
?>

Zoiets?

untested

Of zoiets?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(E_ALL);
$MultiArray = array ("a" => array ("z" => "z","a"), 
"q" => array ("aba", "aaa"), 
"b" => array ("m","a"));
print_r ($MultiArray);
foreach ($MultiArray as $Key => $Value)
{
    aSort ($Value);
    $MultiArray[$Key] = $Value;
}
kSort ($MultiArray);
print_r ($MultiArray);
?>

tested ;)

[ Voor 64% gewijzigd door PrisonerOfPain op 25-01-2004 17:38 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Ik had hier code voor geschreven, maar die staat op mijn computer in Groningen en ik heb WOL nog niet geinstalleerd... als je me mailt kun je de code krijgen.

Het werkte ongeveer als volgt:

1) Haal alle gegevens uit de multi-d-array die je wilt sorteren (max één kolom).
2) Sorteer deze met behoudt van key->value relatie. (asort of arsort geloof ik).
3) Zet de array opnieuw inelkaar.

Het waren iig maar heel weinig regels... maandag kun je 't hebben. Als je me herinnert post ik het hier wel.

Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46
PrisonerOfPain schreef op 25 januari 2004 @ 17:25:
[...]
Of zoiets?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(E_ALL);
$MultiArray = array ("a" => array ("z" => "z","a"), 
"q" => array ("aba", "aaa"), 
"b" => array ("m","a"));
print_r ($MultiArray);
foreach ($MultiArray as $Key => $Value)
{
    aSort ($Value);
    $MultiArray[$Key] = $Value;
}
kSort ($MultiArray);
print_r ($MultiArray);
?>
tested ;)
Hij sorteerd het heel netjes, alleen niet op de manier zoals ik bedoel.
Hij moet eigenlijk sorteren op de score in het array, en dus steeds met het hele array gaan schuiven.
Dit sorteert wel op de manier zoals ik het wil, maar dan verlies ik de key waarde van de 1e array:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
function cmp($a, $b)
{
  if ($a['score'] == $b['score'])
  {
    return 0;
  }
  return ($a['score'] > $b['score']) ? -1 : 1;
}
error_reporting(E_ALL); 
$MultiArray = array ("mail@e.nl" => array ("score" => 1234.1,"name" => "henk"), 
"abc@def.nl" => array ("name" => "sjaak", "score" => 1234.3), 
"zzz@xxx.nl" => array ("score" => 1234.2,"name" => "IkBenDeBeste")); 
print_r ($MultiArray); 
echo "<br>\n";
usort($MultiArray, "cmp");
print_r ($MultiArray);
?>


[edit]
Ok, als ik usort vervang door uasort dan neemt hij de key's ook netjes mee.

iig bedankt voor alle hulp!

[ Voor 22% gewijzigd door KompjoeFriek op 25-01-2004 20:12 ]

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
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
        function result_sort($result,$column,$asc=true)
        {
                /*------------------------------------------------------------\
                | result_sort                                                 |
                |=============================================================|
                | Resorts a result set.                                       |
                |=============================================================|
                | Parameters:                                                 |
                |  + $column (string) Column to sort on                       |
                |  + $result (array)  Result set to sort on. (Required)       |
                |  + $asc    (bool)   Sort ascending (true) or                |
                |                     desceding (false)                       |
                |=============================================================|
                | Returns:                                                    |
                |  (array) Sorted result                                      |
                |=============================================================|
                | Updates / Changelog                                         |
                |  + 2004-01-23 Initial Release                               |
                \____________________________________________________________*/
                if (!is_array($result) || !is_array($result[0]))
                {
                        trigger_error('First argument is not a resultset',E_USER_ERROR);
                }
                $sort = array();
                for ($i = 0; $i < count($result); $i++) // extract data to sort on...
                {
                        $sort[$i] = $result[$i][$column];
                }
                if ($asc) // sort data
                {
                        asort($sort,SORT_REGULAR);
                }
                else
                {
                        arsort($sort,SORT_REGULAR);
                }
                reset($sort);
                $newresult = array();
                $i = 0;
                foreach ($sort as $key => $value) //  build a new (sorted) resultset...
                {
                        $newresult[$i] = $result[$key];
                        $i++;
                }
                return $newresult;
        }


Dat was 'm.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Kijk ook eens naar mijn reply in dit topic

Misschien is het wel handig als je een keer een specifieke ordering wilt hebben.
Pagina: 1