PHP: Sortera Array

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Boden
  • 2011-07-19 13:39

Hej. Har en multidimensional array som jag vill sortera. Arrayen ser ut såhär:

Bil: [bil1] [bil2] [bil3] [bil4]

bil 1-4 är arrayer som ser ut såhär:

bil1 [brand] [model] [miles] [added]

Alltså 4 arrayer i en array.

Jag vill sortera "bil" (dvs huvud arrayen) efter de olika bilarnas "added".

Hur gör man det enklast?

Tacksam för svar

foreach($xml->car as $car)
{
        $acar = array($car->added, $car->brand, $car->model, $car->regno, $car->miles);
        $cararray[] = $acar;
}

sort($cararray, SORT_NUMERIC); <-- funkar inte!

foreach( $cararray as $value )
{
  echo("{$cararray[0][0]} ");
  echo("{$cararray[0][1]} ");
  echo("{$cararray[0][2]} ");
  echo("{$cararray[0][3]} ");
  echo("{$cararray[0][4]} <br>");

Använd funktionen usort.

function sortcars($car1, $car2) {
    return strnatcasecmp($car1['added'], $car2['added']);
}

usort($array, 'sortcars');
  • Medlem
  • Boden
  • 2011-07-19 13:55

Tack för svaret! Tror inte det funkar tyvärr, har inte $car 1, $car2. Jag la till koden i mitt första inlägg, där ser du att alla bilar heter "acar" när de läggs i "cararray". Vet inte om man kan komma runt det på något sätt, är relativt ny med PHP.

Tack

Det enda du behöver ändra i koden är $array till namnet på variabeln med arrayen (verkar vara $cararray)
$car1 och $car2 är interna variabler i sorteringsfunktionen

  • Medlem
  • Boden
  • 2011-07-19 14:19

Okej. Det är ändå något som inte stämmer. Listan får annan ordning, men jag förstår inte riktigt vad den sorteras efter. Här är koden:

/* lägg till i array */

foreach($xml->car as $car)
{
        $acar = array($car->added, $car->brand, $car->model, $car->regno, $car->miles);
        $cararray[] = $acar;
}


/* sortera array */

function sortcars($car1, $car2) {
    return strnatcasecmp($car1['added'], $car2['added']);
}

usort($cararray, 'sortcars');

/* skriv ut */

foreach( $cararray as $value )
{
  echo("{$cararray[0][0]} ");
  echo("{$cararray[0][1]} ");
  echo("{$cararray[0][2]} ");
  echo("{$cararray[0][3]} ");
  echo("{$cararray[0][4]} <br>");
  
    echo("{$cararray[1][0]} ");
  echo("{$cararray[1][1]} ");
  echo("{$cararray[1][2]} ");
  echo("{$cararray[1][3]} ");
  echo("{$cararray[1][4]} <br>");

Detta ger:

1299819497 Volvo V70 FBG069 5366 
1306036730 Volvo V70 DBU204 9800 
1304740540 Volvo V70 GEC314 5357 
1309319995 Volvo V70 TRZ863 20022 
1308283125 Volvo V70 PUO980 11607 
1309406385 Volvo V70 XGD936 8645 
1310183948 Volvo V70 UFL322 13043 
1310443191 Volvo V70 XAX853 15608 
1310010936 Volvo V70 WHX636 15421 

1299819497 Volvo V70 FBG069 5366 
1306036730 Volvo V70 DBU204 9800 
1304740540 Volvo V70 GEC314 5357 
1309319995 Volvo V70 TRZ863 20022 
1308283125 Volvo V70 PUO980 11607 
1309406385 Volvo V70 XGD936 8645 
1310183948 Volvo V70 UFL322 13043 
1310443191 Volvo V70 XAX853 15608 
1310010936 Volvo V70 WHX636 15421 

(Det långa första numret är "added"). Dessutom är $cararray[1][0] samma som $cararray[0][0].

Aha, du har inga index i din array.
En bil-array ser alltså ut så här:

Array(
  0 => '1310010936',
  1 => 'Volvo'
  2 => 'V70',
  3 => 'WHX636',
  4 => '15421'
);

Det finns alltså inget textbaserat index, utan "added" är ju index 0.
Alltså kan du ändra i sorteringen så att den sorterar $car1[0] mot $car2[0] eftersom det är den kolumn du vill sortera efter.

Sedan har du lite feltänk i din foreach-loop, då den kod som du visar just nu bara skriver ut första och andra bilen ($cararray[0] och $cararray[1]) men den skriver ut dem lika många gånger som det finns bilar. Alltså, om du har fem bilar i din array kommer den skriva ut nr 0 och 1 fem gånger.

En foreach-loop fungerar så att den första parametern ($cararray) är den array som skall loopas igenom. För varje varv i loopen kommer just den raden att lagras i $value så du kommer åt just den bilen genom $value.
Du bör alltså ta bort dina echo $cararray... då de skriver ut exakt det nummer som du skriver i klammern. Ersätt med echo $value[0] för "added", $value[1] för namn, $value[2] för regnr osv.

För att få din kod tydligare tycker jag att du bör ha tydliga index i arrayen.

$acar = array($car->added, $car->brand, $car->model, $car->regno, $car->miles);

Detta skapar en array med fem värden:

Array(
  0 => '1310010936',
  1 => 'Volvo',
  2 => 'V70',
  3 => 'WHX636',
  4 => '15421'
);

För att få tydligare index kan du lägga till dem i array-skapandet:

$acar = array('added' => $car->added, 'brand' => $car->brand, 'model' => $car->model, 'regno' => $car->regno, 'miles' => $car->miles);

eller ännu hellre, lägg till lite mellanrum så det blir mer överskådligt:

$acar = array(
            'added' => $car->added, 
            'brand' => $car->brand, 
            'model' => $car->model, 
            'regno' => $car->regno, 
            'miles' => $car->miles
        );

Nu ser arrayen ut så här:

Array(
  'added' => '1310010936',
  'brand' => 'Volvo',
  'model' => 'V70',
  'regno' => 'WHX636',
  'miles' => '15421'
);

och om vi vill skriva ut något är det enkelt att veta hur vi skall komma åt det:

echo $acar['model']; // Skriver ut Volvo
// istället för $acar[1]

echo $acar['regno']; skriver ut WHX636
// istället för $acar[3]

Alltså tycker jag du också ska göra om din foreach-loop:

foreach( $cararray as $thiscar )
{
  echo("{$thiscar[added]} ");
  echo("{$thiscar[brand]} ");
  echo("{$thiscar[model]} ");
  echo("{$thiscar[regno]} ");
  echo("{$thiscar[miles]} <br>");
}

Ser du att koden blir lättare och tydligare att läsa och förstå??

  • Medlem
  • Boden
  • 2011-07-19 20:29

Tack för all hjälp, nu funkar det som det ska!

Härliga tider!

1
Bevaka tråden