FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Har WN som tidsfördriv
|
Jag försöker få min array av objekt att sorteras efter inläggningsdatum (<added>..</added> i XML filen) i PHP men det verkar som jag inte riktigt förstår det här med sortering av objekt med fler dimensioner i usort...
Kan någon vänlig själ upplysa mig om vad det är jag gör för fel? XML filen: http://pastebin.com/ZG07PGMc Koden: http://pastebin.com/PWC8k09G Arrayens uppbyggnad: Kod:
SimpleXMLElement Object ( [car] => Array ( [0] => SimpleXMLElement Object ( [id] => 4422263 [added] => 1272916867 ) [1] => SimpleXMLElement Object ( [id] => 4409040 [added] => 1272360932 ) [2] => SimpleXMLElement Object ( [id] => 4409043 [added] => 1274456478 ) [3] => SimpleXMLElement Object ( [id] => 4459271 [added] => 1274450187 ) ) ) |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Har WN som tidsfördriv
|
usort($xml->car, [..] bör det ju vara
![]() |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Har WN som tidsfördriv
|
Om det bara var så...
![]() Följande kod: Kod:
<?php $xml = simplexml_load_file("test.xml"); function mysort($a, $b) { if($a->added == $b->added) { return 0; } return ($a->added < $b->added) ? -1 : 1; } usort($xml->car, "mysort"); // Returnerar 0 = fail foreach($xml->car as $car) { echo $car->added . " (" . date('Y-m-d h:m', (int)$car->added) . ")<br />"; } ?> Kod:
1272916867 (2010-05-03 10:05) 1272360932 (2010-04-27 11:04) 1274456478 (2010-05-21 05:05) 1274450187 (2010-05-21 03:05) Senast redigerad av jayzee den 2010-05-31 klockan 18:41 |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Jag tror inte att $xml->car returnerar en array. Du måste alltså själv göra en ny array som du sedan sorterar. Något i stil med:
Kod:
$car_data = array(); foreach($xml->car as $car) $car_data[(int)$car->added] = $car; usort($car_data, "mysort"); ... Senast redigerad av znap den 2010-05-31 klockan 23:13 |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Har WN som tidsfördriv
|
Så det finns ingen annan lösning än att göra om array av objekt till vanlig array och sortera den då? Anledningen till att jag frågar är att jag helst vill behålla objektstrukturen och att varje objekt innehåller ca. 20 attribut (ej med i mitt exempel).
|
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Supermoderator
|
Om det inte finns någon inbyggd sorteringsfunktion i objektet så kan det omöjligen veta hur det ska sorteras, eller hur? Alternativet är att bygga en egen sorteringsfunktion vilket kanske är motiverat i ditt fall men vi vet ju inte direkt hur ditt system är uppbyggt.
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Har WN som tidsfördriv
|
Citat:
![]() Original XML filen innehåller dock fler attribut förrutom 'added' i varje objekt men det är oviktigt i detta sammanhang. Senast redigerad av jayzee den 2010-06-01 klockan 13:29 |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Mycket flitig postare
|
Citat:
znap:s kod bör funka om du tar bort indexet. PHP-kod:
|
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Har WN som tidsfördriv
|
Det gjorde susen - tusen tack qson!
En modifiering man måste göra är explicit omvandla 'added' till int eller string då man inte kan jämföra attribut med strängar, då funkar det inte. Ändringen: PHP-kod:
Förstår dock inte varför KarlRoos förslag inte fungerade (även med typecasting)... Senast redigerad av jayzee den 2010-06-01 klockan 15:21 |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Mycket flitig postare
|
CarlRoos förslag fungerar inte därför att $xml->car inte är en array. Det är ett XML-objekt med en iterator (som gör att den fungerar med foreach).
sort-funktionerna fungerar bara med arrayer. Inte med iterator-objekt. |
||
![]() |
![]() |
Svara |
|
|