2014-01-05 99 views
1

非常基本的問題但是我在PHP.NET上找到答案時遇到了一些麻煩。通過中間鍵重新排序PHP數組作爲開始(循環排序)

我有以下陣列:

Array (

[1] => Array 
    (
     [1] => 4 
     [2] => 1 
     [3] => 5 
     [4] => 3 
    ) 

[2] => Array 
    (
     [5] => 2 
     [6] => 8 
     [7] => 7 
     [8] => 6 
    ) 

[3] => Array 
    (
     [9] => 10 
     [10] => 9 
     [11] => 12 
     [12] => 11 
    ) 

[4] => Array 
    (
     [13] => 15 
     [14] => 16 
     [15] => 14 
     [16] => 13 
    ) 

) 

我想重新排序的數組,以便在第一系列陣列的關鍵數字3成爲第一,那麼剩下的是重從那裏訂購到最終得到的結果是:

Array (

[3] => Array 
    (
     [9] => 10 
     [10] => 9 
     [11] => 12 
     [12] => 11 
    ) 

[4] => Array 
    (
     [13] => 15 
     [14] => 16 
     [15] => 14 
     [16] => 13 
    ) 

[1] => Array 
    (
     [1] => 4 
     [2] => 1 
     [3] => 5 
     [4] => 3 
    ) 

[2] => Array 
    (
     [5] => 2 
     [6] => 8 
     [7] => 7 
     [8] => 6 
    ) 

) 

我正在尋找一種方式來做到這一點,所以我可以定義我需要排序的數組,然後第一級密鑰,然後它會返回數組以這種方式。

標準的PHP密鑰似乎沒有提供這樣的東西,所以最好能夠擁有一個單獨的函數,如$ newArray = reorder_array($ array,$ key);

我不需要任何第二層的排序,只有最初的4個主/第一層數組部分。

你的幫助是非常感謝,因爲我一直坐在這一個一段時間沒有一個清晰和簡單的解決方案。

+0

你試過asort()函數嗎? – dev

+1

我不明白你想要做的排序邏輯,對不起。請解釋你想達到的邏輯(例如:究竟是什麼使元素上升或下降等)。 – Calimero

+1

@Calimero圓形排序。 – safarov

回答

3

您重新排序可以用一個foreach循環簡單地實現,如:

function reorderArray($array, $key) 
{ 
    $found = false; 
    foreach($array as $k=>$v) 
    { 
     $found = $found || $k===$key; 
     if(!$found) 
     { 
      unset($array[$k]); 
      $array[$k] = $v; 
     } 
     //else break can be added for performance issues 
    } 
    return $array; 
} 

與使用

$array=[1=>'foo', 4=>'bar', 9=>'baz', 'test'=>51]; 
var_dump(reorderArray($array, 9)); 
var_dump(reorderArray($array, 'test')); 
var_dump(reorderArray($array, 'no_such_key'));//original array in result 

-check this演示。但是,如果按鍵是連續的數字,則可以使用array_slice()調用輕鬆實現。

+0

解決了它,謝謝:) – vrwd