2013-01-25 93 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

相關問題