---
title: "Sortera array"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/169679-sortera-array"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Web-Tor"
published: "2008-03-07T09:51:44.000Z"
updated: "2008-03-10T12:22:46.000Z"
replies: 14
views: 953
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/169679-sortera-array"
---

# Sortera array

## #1 — Web-Tor, 2008-03-07T09:51Z

```php
<?php

$arrTot = array(
	array('2','b'),
	array('1','c'),
	array('3','a'),
);

sort($arrTot);
show($arrTot);

function show($arrTot){
	for($i=0; $i < count($arrTot) ; $i++){
		for($ii=0; $ii < count($arrTot[$i]) ; $ii++){
			echo $arrTot[$i][$ii] . "<br>";
		}
		echo "---------------<br>";
	}
}

?>
```

Den här koden sorterar på första "kolumnen" (1,2,3). Hur gör jag för att sortera på den andra kolumnen (a,b,c)?

Så att output alltså blir:

> 3
> a
> \---------------
> 2
> b
> \---------------
> 1
> c
> \---------------

Permalänk: https://www.webforum.nu/p/169679

## #2 — colione, 2008-03-07T11:02Z

Den där koden sorterar visst på andra kolumnen. Den sorterar alltså på a b c.

Finns det något skäl till varför då har en array i en array?

Sen har du angivit dina nummer som strängar. Det är inte så jättebra.

Vill du sortera på första kolumnen:
<http://se2.php.net/ksort>
Kan även vara en idé att sätta SORT_STRING flaggan.

sen skulle jag tipsa om print_r() eller var_dump() för att visa innehållet i arrayer. ;)

Ett annat tips när du jobbar med arrayer om du ska köra en for på dem är att använda:

```php
foreach ($variable as $key => $value) {
	
}
```

då får du ut både nycken och värdet samtidigt.

Permalänk: https://www.webforum.nu/p/2086689

## #3 — Web-Tor, 2008-03-07T12:10Z

> **colione skrev:**
>
> Den där koden sorterar visst på andra kolumnen. Den sorterar alltså på a b c.

Va? För mig ser outputen ut så här:

> 1
> c
> \---------------
> 2
> b
> \---------------
> 3
> a
> \---------------

Den sorterar alltså på första kolumnens värden 1, 2, 3

Om man byter ut array-deklarationen mot:

```
 $arrTot = array( 
    array('2','c'), 
    array('1','b'), 
    array('3','a'), 
);
```

Så bli min output:

> 1
> b
> \---------------
> 2
> c
> \---------------
> 3
> a
> \---------------

 Den sorterar alltså på första kolumnens värden 1, 2, 3 medan andra kolumnens värden blir osorterat.

Ser din output ut på något annat sätt?

Koden jag visa här är alltså ett kraftigt förenklat exempel av min riktiga kod. Den riktiga koden är ett par tusen rader och jag tänkte att det blir onödigt för er att sätta er in i den koden. Så ni kan helt strunta i hur arrayerna skrivs ut t.ex. ;)

Permalänk: https://www.webforum.nu/p/2086699

## #4 — The_Hulk, 2008-03-07T12:24Z

Har du kollat något på funktionen array-multisort
länk: <http://se2.php.net/manual/sv/function.array-multisort.php>

Permalänk: https://www.webforum.nu/p/2086702

## #5 — SPiN, 2008-03-07T12:24Z

```php
function __compare__values($x, $y) {
     return strcmp($x[1], $y[1]);
}

usort($arrayToSort, "__compare__values");
```

Kanske gör tricket? I funktionen '\__compare__values' ser du att du kan ändra vilket index som ska jämföras efter.

Notera dock att första dimensionens index ändras (enl. php.net)! <http://www.php.net/usort>

```php
$arrayToSort[0][0] = "b";
$arrayToSort[1][0] = "a";
$arrayToSort[2][0] = "c";

usort($arrayToSort, "__compare__values");

==>

$arrayToSort[0][0] = "a";
$arrayToSort[1][0] = "b";
$arrayToSort[2][0] = "c";
```

Permalänk: https://www.webforum.nu/p/2086703

## #6 — Web-Tor, 2008-03-07T12:45Z

> **The_Hulk skrev:**
>
> Har du kollat något på funktionen array-multisort
> länk: <http://se2.php.net/manual/sv/function.array-multisort.php>

Jag har kollat men kan inte se hur jag skulle använda det för att lösa mitt problem?

> **SPiN skrev:**
>
> Kanske gör tricket? I funktionen '\__compare__values' ser du att du kan ändra vilket index som ska jämföras efter.

Det ser ut att funka! Tror inte att det gör något att index ändras i mitt fall. Jag får laborera vidare med den här funktionen. Tack SPiN!

Permalänk: https://www.webforum.nu/p/2086710

## #7 — SPiN, 2008-03-07T13:03Z

Varsågod. :)

Jag vet dock inte hur den förhåller sig prestandamässigt, om du - som du säger - har ett par tusen poster i arrayerna.

Markera som löst? ;)

Permalänk: https://www.webforum.nu/p/2086714

## #8 — Web-Tor, 2008-03-07T13:31Z

> **SPiN skrev:**
>
> Jag vet dock inte hur den förhåller sig prestandamässigt, om du - som du säger - har ett par tusen poster i arrayerna.

Jag fyller arrayerna via en CSV-fil som i västa fall innehåller 6000-7000 rader. :l

> **SPiN skrev:**
>
> Markera som löst? ;)

Jag avvaktar lite ifall någon har något annan smart lösning.

Permalänk: https://www.webforum.nu/p/2086718

## #9 — SPiN, 2008-03-07T13:54Z

Nu har jag sökt reda på lite information kring den här typen av sortering, och det visar sig att den är fruktansvärt snabb.

Här är en kille som körde igenom en array på 10 000 poster på under en halv sekund:
<http://mgccl.com/2007/06/10/much-better-than-quicksort>

Permalänk: https://www.webforum.nu/p/2086720

## #10 — Web-Tor, 2008-03-10T08:23Z

Det ser ut att funka riktigt bra!
Kan hända att jag återkommer eftersom det finns en risk att jag måste in och sortera på andra kolumner i 2:a och 3:e hand. ;)

Permalänk: https://www.webforum.nu/p/2087160

## #11 — Web-Tor, 2008-03-10T11:55Z

Det kom tidigare än jag trodde:
Finns det någon enkelt sätt att sortera på 2:a kolumnen i första hand och 3:e kolumen i andra hand?

```
$arrTot = array(
    array('3','a','aaa'),
    array('1','b','aaa'),
    array('2','a','bbb'),
);
```

En array kanske inte ens är det bästa sättet att lagra detta på. Finns det något annat sätt att göra i PHP för att lagra en rad/kolumn-struktur?

Permalänk: https://www.webforum.nu/p/2087208

## #12 — spango, 2008-03-10T12:05Z

Ändra din jämförelsefunktion:

```
function __compare__values($x, $y) {
     $cmp = strcmp($x[1], $y[1]);
     if ($cmp != 0) return $cmp; // olika värden i kol 1, sortera på kol 1
     else return strcmp($x[2], $y[2]); // kol 1 lika, sortera på kol 2
}
```

Permalänk: https://www.webforum.nu/p/2087213

## #13 — Troxy, 2008-03-10T12:10Z

Personligen skulle jag försöka mellanlagra i en SQL-databas, då kan du som bekant sortera mycket enkelt och snabbt.

Permalänk: https://www.webforum.nu/p/2087215

## #14 — Web-Tor, 2008-03-10T12:20Z

> **spango skrev:**
>
> Ändra din jämförelsefunktion:

Nice! Får bygga vidare på detta för att få till en 3:e och en 4:e sortering också. Sen för vi hoppas att det fortfarande går hyfsat snabbt. ;)

> **Troxy skrev:**
>
> Personligen skulle jag försöka mellanlagra i en SQL-databas, då kan du som bekant sortera mycket enkelt och snabbt.

Jag håller med dig men kundkraven gör att jag inte kan mellanlagra informationen någonstans.

Finns det inte något enklare sätt att lagra en tabellstruktur i PHP än arrayer?

Permalänk: https://www.webforum.nu/p/2087219

## #15 — SPiN, 2008-03-10T12:22Z

spango träffade huvudet på spiken. :)

PHP har tyvärr inga collections-klasser, utan allt bygger på arrayer. Alla stack- och kö-funktioner opererar endast på arrayer (array_push(), array_pop(), osv.)

Permalänk: https://www.webforum.nu/p/2087220

---

Tråden på webben: https://www.webforum.nu/amne/php/169679-sortera-array
