Php 对数组进行排序的有效方法?

Php 对数组进行排序的有效方法?,php,arrays,sorting,Php,Arrays,Sorting,我有一个可变长度数组,包含按startdate排序的事件,如下所示: Array ( [0] => stdClass Object ( [id] => 1978 [date] => 2012-09-29 ) [1] => stdClass Object ( [id] => 1979 [date] => 2012-10-14 ) ...etc.... 我需要创建

我有一个可变长度数组,包含按startdate排序的事件,如下所示:

Array
(
[0] => stdClass Object
    (
        [id] => 1978
        [date] => 2012-09-29
    )

[1] => stdClass Object
    (
        [id] => 1979
        [date] => 2012-10-14
    )

...etc....

我需要创建一个函数,该函数取一个事件,并放入一个长度为七的新数组的中间,并将事件的邻居放在每一边。p> 因此,如果将事件5传递给函数,则输出应为:

[2][3][4][5][6][7][8]
[10][11][12][1][2][3][4]
[2][3][4][5][6][1][]
如果将第一个事件传递给函数,且原始事件量为12,则输出应为:

[2][3][4][5][6][7][8]
[10][11][12][1][2][3][4]
[2][3][4][5][6][1][]
如果原始事件量为6,且第五个事件已通过,则输出应为:

[2][3][4][5][6][7][8]
[10][11][12][1][2][3][4]
[2][3][4][5][6][1][]
因此,事件列表应始终“环绕”在新数组中,并尽可能多地填充它

我已经拼凑出了一个解决方案,其中包括很多步骤。我真的不喜欢它,这让我想:

如何以最高效、最优雅的方式实现这一点

You need to change the values in this codes
  define('TO_SHOW',7); // number of items to show in your case it is 7
  $selected      = 1; //// which one you need need at center.
还有你的阵型

执行此命令并尝试:

<?php 

define('TO_SHOW',7); // number of items to show in your case it is 7

function change_order($arry, $sel){
   $arr_cnt      = count($arry);   
   $shift_count  = $arr_cnt - (ceil(TO_SHOW/2)-$sel);
   for($i=0; $i<$shift_count; $i++){
      array_push($arry, array_shift($arry));
   }
   return array_slice($arry, 0, TO_SHOW);
} 

$arr            = array(array(
                    "id" => 1,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 2,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 3,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 4,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 5,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 6,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 7,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 8,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 9,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 10,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 11,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 12,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 13,
                    "date" => 2012-09-29
                    ),
                    array(
                    "id" => 14,
                    "date" => 2012-09-29
                    )
                );

$selected      = 1; //// centre one             
$test   = change_order($arr, $selected);

echo "<pre>";
print_r($test);
?>


您当前的解决方案是什么?使用
ksort()
usort()
有什么问题?我已经计算了原始数组将向左或向右移位的量,以及将从移位中“切断”哪些键。然后我创建一个新数组,从[3]开始填充,然后在左侧或右侧添加截断键。它完全是手工编写的,让我觉得我应该用其他方式来做……为什么
$selected
是函数的参数,而
TO\u SHOW
是一个常量?您选择的将是一个变量?您在中心需要的是;但是为什么
TO_SHOW
也不是一个变量呢?似乎不必要的全局范围。这将是一个常量,您要显示多少项,在所有情况下都是7。不过,最好将其作为函数的参数,而不是整个应用程序的全局参数。