2014-01-05 67 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