2013-04-08 135 views
0

我遇到了數組排序問題。通過其中一個元素重新排序數組元素

我陣列的結構是這樣的:

array(4) { 
    [1]=> 
    array(5) { 
    ["type"]=> 
    string(4) "A" 
    ["index"]=> 
    int(1) 
    } 
    [2]=> 
    array(5) { 
    ["type"]=> 
    string(4) "B" 
    ["index"]=> 
    int(4) 
    } 
    [3]=> 
    array(5) { 
    ["type"]=> 
    string(4) "C" 
    ["index"]=> 
    int(2) 
    } 
    [4]=> 
    array(5) { 
    ["type"]=> 
    string(4) "D" 
    ["index"]=> 
    int(3) 
    } 
} 

正如你可以看到,每個子陣列內,有一個關鍵的「指數」,和值以正確的順序1-2-3有沒有-4但是它是1-4-2-3。

如何讓其子陣列,以正確的順序列出我可以排序這個數組?

P.S .:的acutal陣列大得多&比這更加複雜。

+2

此問題未顯示任何研究工作。 **做你的作業很重要**。告訴我們你發現了什麼,***爲什麼它不符合你的需求。這表明你已經花時間去嘗試幫助你自己了,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit 2013-04-08 15:47:20

+0

上面的鏈接有助於thx! – JuLy 2013-04-08 15:54:00

+0

對於FreshPrinceOfSO,U打字所花的時間已經夠回答這個問題 – JuLy 2013-04-08 15:57:01

回答

3
usort(
    $myArray, 
    function ($a, $b) { 
     if ($a['index'] == $b['index']) { 
      return 0; 
     } 
     return ($a['index'] < $b['index']) ? -1 : 1; 
    } 
); 
+0

+1,我們會怎樣是通過命名功能的首選解決方案,因爲PHP的5.3,在許多情況下。然而,仍然有一些用例指定回調是有用的。 (+感謝您幫助我解決語法錯誤!) – hek2mgl 2013-04-08 16:03:24

0

一個簡單快速的解決方案,用於重新索引數組。

$old ; // Your old array 
$new = array() ; 
foreach ($old as $child){ 
    $new[$child['index']] = $child ; 
} 
1

對此,您可以使用函數usort()。它接受一個未排序的數組和一個回調函數作爲它的參數。在回調函數中,您可以定義如何比較元素。這裏談到一個例子:

function compare($a, $b) { 
    if($a['index'] === $b['index']) { 
     return 0; 
    } 
    return $a['index'] < $b['index'] ? -1 : 1; 
} 

usort($array, 'compare'); 

注:回調可以是匿名函數或常規函數的名稱。我使用了@MarkBaker使用匿名函數的函數名稱。所以你有兩個例子。