---
title: "Sortera en array - siffror blir fel"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/171130-sortera-en-array-siffror-blir-fel"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "learn"
published: "2008-04-28T11:33:03.000Z"
updated: "2008-04-29T10:52:58.000Z"
replies: 9
views: 764
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/171130-sortera-en-array-siffror-blir-fel"
---

# Sortera en array - siffror blir fel

## #1 — learn, 2008-04-28T11:33Z

Jag sorterar en flerdimensionell array på följande sätt ([usort](http://se2.php.net/manual/sv/function.usort.php)) :

```php
function sortera_array($a, $b) {

	global $ordning;

	return strcmp($a[$ordning], $b[$ordning]);
	
}

usort($min_array, "sortera_array");
```

Funkar bra på strängar/bokstäver men innehåller arrayen siffror blir det knas. 

Exempel:

> 111
> 1192
> 128
> 162
> 346
> 36
> 444
> 454

 

Verkar som att funktionen inte hanterar dessa värden som siffror utan som strängar.

Hur gör jag? Jag har testat köra intval() på det som stoppas in i arrayen men det gör ingen skillnad...

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

## #2 — spango, 2008-04-28T11:48Z

Det beror på att du använder strcmp, som namnet antyder är den till för **str**ing **c**o**mp**arison. Är det tal som ligger i arrayen på platsen $ordning kan du använda

```
function sort_num_array($a, $b) {
    global $ordning;
    return $a[$ordning] - $b[$ordning];
}
```

Om du inte vet ifall det kommer vara strängar eller tal får du göra typ

```
function sort_vartype_array($a, $b) {

    global $ordning;
    $x = $a[$ordning], $y = $b[$ordning];
    if (is_int($x) || is_float($x)) return $x - $y;
    else if (is_string($x)) return strcmp($x, $y);
    else // varken sträng eller tal
}
```

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

## #3 — learn, 2008-04-28T11:58Z

Schysst!

En fråga till; hur gör jag om jag vill kunna ändra ordningen också? Alltså "5,4,3,2,1" istället för "1,2,3,4,5".

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

## #4 — spango, 2008-04-28T12:10Z

Antingen använder du <http://www.php.net/function.array-reverse> eller så vänder du på resultatet av jämförelsen. Typ

```
function sort_vartype_array($a, $b) {
    global $ordning;
    $x = $a[$ordning], $y = $b[$ordning];
    if (is_int($x) || is_float($x)) return $x - $y;
    else if (is_string($x)) return strcmp($x, $y);
    else // varken sträng eller tal
} 

// Alt. 1
usort($min_array, "sortera_array"); 
if ([I]/* sortera fallande */[/I]) $min_array = array_reverse($min_array); 

// Alt 2
function sort_vartype_desc($a, $b){ return -sort_vartype_array($a, $b); }
if ([I]/* sortera fallande */[/I]) usort($min_array, "sort_vartype_desc"); 
else usort($min_array, "sortera_array");
```

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

## #5 — learn, 2008-04-28T16:55Z

Hmm, en följdfråga; hur ser "sorteringsfunktionen" ut om jag en till dimension i arrayen? Typ så här:

```php
$min_array[1] = array('Namn' => array('Förnamn'=>'Johan', 'Efternamn'=>'Andersson'), 'Ålder'=>'25')

$min_array[2] = array('namn' => array('Förnamn'=>'Richard', 'Efternamn'=>'Svensson'), 'Ålder'=>'28')
```

Sortera på efternamn. Hur ser funktionen ut? Min gamla håller ju då inte längre:

```php
function sortera_array($a, $b) {

    global $ordning;

    return strcmp($a[$ordning], $b[$ordning]);
    
}

usort($min_array, "sortera_array");
```

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

## #6 — spango, 2008-04-29T07:55Z

Varför inte? Det är bara att se till att $ordning innehåller strängen "Efternamn".

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

## #7 — learn, 2008-04-29T09:00Z

Jasså! Ska testa.

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

## #8 — learn, 2008-04-29T09:17Z

Nu har jag en riktigt lurigt problem... :)

Om min array istället är uppbyggd enligt följande:

```php
 $min_array[1] = array('Namn' => array('Johan', 'Andersson'), 'Ålder'=>'25')

$min_array[2] = array('Namn' => array('Richard', 'Svensson'), 'Ålder'=>'28')
```

Hur gör jag då för att sortera på t.ex. efternamnet??

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

## #9 — learn, 2008-04-29T10:19Z

Någon problemlösare där ute? :)

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

## #10 — spango, 2008-04-29T10:52Z

Du får hitta på nåt fiffigt sätt att se till du jämför *$a\["Namn"\]\[1\]* med *$b\["Namn"\]\[1\]*. Blir lite bökigt men du har inte mycket val. Sen tycker jag kanske att du borde låta bli att ha såna strukturer, men...

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

---

Tråden på webben: https://www.webforum.nu/amne/php/171130-sortera-en-array-siffror-blir-fel
