| 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
)
)
)
|
||
|
|
Svara med citat
|
|
|
#2 | ||
|
|||
|
Har WN som tidsfördriv
|
usort($xml->car, [..] bör det ju vara
|
||
|
|
Svara med citat
|
|
|
#3 | ||
|
|||
|
Har WN som tidsfördriv
|
Om det bara var så...
Tyvärr så fungerar det inte.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 19:41 |
||
|
|
Svara med citat
|
|
|
#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-06-01 klockan 00:13 |
||
|
|
Svara med citat
|
|
|
#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).
|
||
|
|
Svara med citat
|
|
|
#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 |
||
|
|
Svara med citat
|
|
|
#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 14:29 |
||
|
|
Svara med citat
|
|
|
#8 | ||
|
|||
|
Mycket flitig postare
|
Citat:
znap:s kod bör funka om du tar bort indexet. PHP-kod:
|
||
|
|
Svara med citat
|
|
|
#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 16:21 |
||
|
|
Svara med citat
|
|
|
#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 med citat
|
| Svara |
|
|