2013-01-25 116 views
2

我variabel长度的数组,包含由开始日期排序的事件,看起来像这样:排序数组的有效方法?

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

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

...etc.... 

我需要做一个函数,它的事件之一,并在一个新阵列的中部,把长度恰好为7,并将事件的邻居放在每一边。

所以,如果事件5传递给函数,输出应该是:

[2][3][4][5][6][7][8] 

如果第一个事件被传递给函数和事件的原始量为12,输出应该是:

[10][11][12][1][2][3][4] 

如果事件的一部开拓创新量是6,和第五事件被传递,则输出应该是:

[2][3][4][5][6][1][] 

因此,事件列表应该总是在新数组中“环绕”并尽可能地填满它。

我一起砍了一个解决方案,涉及很多步骤。我真的不喜欢它,它让我想知道:

这将如何以最高效和优雅的方式完成?

+1

什么是你目前的解决方案?你在使用'ksort()'或'usort()'时遇到了什么问题? –

+0

我已经计算出原始数组将被转移到左侧还是右侧,以及将从转变中“切断”哪些键。然后我创建一个新的数组并开始从[3]中填充它,然后将截断键添加到左侧或右侧。这是非常手动的,让我感觉,我应该以其他方式做... – acrmuui

回答

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); 
?> 
+0

为什么'$ selected'是函数的参数,但是'TO_SHOW'是一个常量? – cmbuckley

+0

您所选择的将是一个变量仪式?中心需要的那个 –

+0

是的;但为什么'TO_SHOW'不是一个变量呢?看起来像不必要的全球范围。 – cmbuckley

相关问题