Avatar billede heyn Nybegynder
09. januar 2006 - 11:07 Der er 13 kommentarer og
1 løsning

Sortering af flerdimentionelle arrays af class'es

Hej alle.
Jeg har oprettet en class action der blandt andet indeholder værdierne 'sagID', 'actionID' og 'opret'. (opret har formatet ("YYYY-hh-mm HH-ii_ss").
Jeg har lavet et array $action som indeholder objekter af klassen action, og som har nøgleværdierne sagID og actionID.
$action['sagID']['actionID'].
Dette array ønsker jeg nu at sortere således at de objekter tilhørende $action['sagID'] sorteres efter opret.
Et eksempel:
$action[5][4]->opret = "2006-01-09 10:30:00"
$action[5][3]->opret = "2006-01-09 10:45:00"
$action[2][10]->opret = "2006-01-09 10:15:00"
$action[2][12]->opret = "2006-01-09 10:20:00"
Rækkefølgen af [sagID] er altså ligegyldig, og er allerede sorteret. Det er sorteringen af det indre array[actionID] som er problemet. Begrundelsen er at jeg skal aflæse disse arrays i rækkefølge ved brug af reset(), current() og next().
Kan nogle klare den?
Hilsen Christian
Avatar billede heyn Nybegynder
09. januar 2006 - 11:11 #1
Hovsa - uddybelse: eksemplet viser resultatet efter sorteringen.
Avatar billede barklund Nybegynder
09. januar 2006 - 11:34 #2
Det må være noget med:

function cmp_cases($a, $b) {
  return strftime($a->opret) < strftime($b->opret);
}
foreach($action as &$sager) {
  uasort($sager, "cmp_cases");
}

Måske bare :)

--
Morten Barklund
Avatar billede barklund Nybegynder
09. januar 2006 - 11:34 #3
(givet at strftime kan æde dit datoformat, men det tror jeg nok)
Avatar billede barklund Nybegynder
09. januar 2006 - 11:34 #4
Nejda, strtotime er det:

function cmp_cases($a, $b) {
  return strtotime($a->opret) < strtotime($b->opret);
}

:)
Avatar billede heyn Nybegynder
09. januar 2006 - 12:29 #5
Hej barklund.
Det er netop alle disse typer 'sort'-funktioner jeg ikke helt forstår. Desuden kendte jeg heller ikke 'foreach()'
Skal det forstås således at:
1) foreach($action as &$sager) gennemløber alle alle poster i et givent array (som jo i dette tilfælde er en serie af 'indre' arrays).
2) uasort udfører sortering på hver af de 'indre' arrays ved at sammenligne alle kombinationer af $a->opret,$b->opret og at man ikke behøver at skrive (...) når man kalder cmp_cases?
3) Vil det sige at når jeg (meget ofte) har udført rutinen

reset($et_array);
for ($i=0;$i<count($et_array);$i++){
    Forskellige handlinger på current($et_array);
    ...
    ...
    next($et_array);
}

akkurat ligesågodt kunne have skrevet:

foreach($et_array as &$arr){
    Forskellige handlinger på $arr;
    ...
    ...
}
?
Mvh Christian
Ja - strtotime() - Jeg har lært det ved mange fejl!!!
Avatar billede heyn Nybegynder
09. januar 2006 - 12:33 #6
Nåe ja. Så var der også lige :)
Det har jeg aldrig set før - hvad er meningen?
Christian
Avatar billede barklund Nybegynder
09. januar 2006 - 13:01 #7
at bruge & foran argumentet i foreach er blot for at få en reference til det array, som vi vil sortere - istedet for en kopi af det.

Og så var der også lige hvad? Min smiley?

Men derudover ja mht. foreach og uasort - og ja, du angiver blot cmp_cases som den funktion, der skal bruges til at sorteres med - du skal ikke kalde funktionen...
Avatar billede heyn Nybegynder
09. januar 2006 - 13:25 #8
Nåe - nu forstår jeg. Noget i stil med:
          ________
  ___  (  o o  )  ___
__(  )__|___  ___|_|  |___
  |||||    (  )    |||||
            --
Ang reference - er array ikke altid i forvejen oprettet som en pointer til hukommelsen, så man kun behøver at bruge & når der er tale om almindelige variable (som foreksempel int og string)?
Men iøvrigt - et godt SVARET - altså SVAR.

Mvh Christian.
Avatar billede heyn Nybegynder
09. januar 2006 - 13:27 #9
Formatet i denne boks er øjensynligt ikke HELT det samme som ovenstående - det burde være Kill Roy.
Avatar billede barklund Nybegynder
09. januar 2006 - 13:31 #10
Hvis jeg skriver:

$a = array("foo");
$b = $a;

Så er $b en kopi af $a, og retter jeg $b, så er $a uændret. Sådan er det i hvert fald i PHP4 - bruger du PHP5, så kan du ignorere den del, hvor arrays overføres som referencer implicit :)

--
Morten Barklund
Avatar billede heyn Nybegynder
09. januar 2006 - 13:48 #11
Nåe - Jeg troede det var som i C++.
Ja - Jeg anvender PHP5.
Tak - Endnu et godt SVAR - Altså et SVAR.
Mvh Christian
Avatar billede barklund Nybegynder
09. januar 2006 - 13:58 #12
Okay, så lægger jeg et SVAR :)

Og nej, men i PHP5 er det dog :)
Avatar billede heyn Nybegynder
09. januar 2006 - 14:42 #13
Ok - fede svar.
Mvh Christian
Avatar billede barklund Nybegynder
09. januar 2006 - 16:44 #14
Tark :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester