2011-03-31 58 views
2

如何通過其中一個值排序關聯數組?如何使用PHP中包含的關聯數組的子字段對關聯數組進行排序?

例如:

$arr = array(
    'ted' => array('age' => 27), 
    'bob' => array('age' => 18), 
    'jay' => array('age' => 24) 
); 

$arr = ??? 

foreach ($arr as $person) 
    echo $person['age'], ', '; 

所以輸出是:

18, 24, 27 

這是一個過於簡單的例子只是爲了證明我的問題。我需要$arr是一個關聯數組。

+4

如果你搜索棧 - 你會發現很多答案http://stackoverflow.com/search?q = php + sort +關聯+數組 – diagonalbatman 2011-03-31 10:58:28

+0

完全相同的問題在一個小時內被詢問 – 2011-03-31 11:00:14

+0

沒有進攻@Lea Hayes,但只是想到爲什麼可能在這裏SO沒有關於這個網站如何工作的基本知識。 – fabrik 2011-03-31 11:03:26

回答

6

uasort()功能允許您指定在此值返回它的比較一個回調函數,它將負責在兩個元素之間進行比較 - 所以,如果你實現了正確的回調函數,應該做得很好。

在這裏,你必須實現一個回調函數將接收兩個數組 - 和compmare的age項目:

function callback($a, $b) { 
    if ($a['age'] > $b['age']) { 
    return 1; 
    } else if ($a['age'] < $b['age']) { 
    return -1; 
    } 
    return 0; 
} 


在下面的代碼部分使用功能:

$arr = array(
    'ted' => array('age' => 27), 
    'bob' => array('age' => 18), 
    'jay' => array('age' => 24) 
); 

uasort($arr, 'callback'); 
var_dump($arr); 

你會得到你該得到的數組:

array 
    'bob' => 
    array 
     'age' => int 18 
    'jay' => 
    array 
     'age' => int 24 
    'ted' => 
    array 
     'age' => int 27 
+0

你確定你的比較函數在所有情況下都能正常工作嗎?根據手冊*如果第一個參數分別小於,等於或大於第二個參數,則比較函數必須返回小於,等於或大於零的整數*您的比較函數只返回「 true「,將被分別轉換爲」1「或」false「,分別爲」0「。 – 2011-03-31 11:10:39

+0

@Stefan:ergh;我應該重新閱讀maual頁面,儘管更多一點;我編輯了我的答案來解決這個問題。謝謝你的評論 ! – 2011-03-31 11:12:29

1

既然你在子陣列內的值排序排序方式之一,有沒有一個內置功能這將完成100%的工作。我會做一個用戶定義的排序有:

http://www.php.net/manual/en/function.uasort.php

下面是一個例子比較功能,基於嵌套數組

<?php 
// Comparison function 
function cmp($left, $right) { 
    $age1 = $left['age']; 
    $age2 = $right['age']; 
    if ($age1 == $age2) { 
     return 0; 
    } 
    return ($age1 < $age2) ? -1 : 1; 
} 

uasort($array, 'cmp'); 
7

這是一個經典的例子,其中PHP 5.3匿名函數派上用場:

uasort($arr, function($a, $b) { 
    return $a['age'] - $b['age']; 
}); 

$a['age'] - $b['age']是一個小把戲。它的工作原理是回調函數預期會返回一個值< 0是$a小於$b,如果$a大於$b,則值大於0。

0

你不只是排序關聯數組,你排序關聯數組的關聯數組;)

一個uasort通話是你追求的

uasort($array, function ($a, $b) { 
    if ($a['age'] === $b['age']) { 
     return 0; 
    } 
    return $a['age'] > $a['age'] ? 1 : -1; 
});