2009-12-20 68 views
1

遇到麻煩試圖找出如何實現這一編程挑戰我的Zend框架應用程序:PHP循環,日期排序挑戰

我需要創建一個數組,看起來像這樣:

$array = array(
    0 => stdClass()->monthName 
        ->monthResources = array() 
    1 => stdClass()->monthName 
        ->monthResources = array() 
); 

這是原來的數組我有工作:

$resources = array(
    0 => Resource_Model()->date (instance of Zend_Date) 
    1 => Resource_Model()->date 
    2 => Resource_Model()->date 
    //etc... 
); 

原來陣列($resources)已按日期排序(遞減),所以我需要創建一個數組w ^這裏資源按月分組。我只想要有資源的月份,所以如果資源跳過一個月,那麼在最後一個數組中不應該有一個stdClass對象。

我也希望這個快速處理,所以任何優化代碼(並仍然是可讀的)的建議將是偉大的。我怎樣才能做到這一點?

+2

這將有助於查看「Resource_Object()」的代碼,否則答案將太泛化。 – kiamlaluno 2009-12-20 23:09:48

回答

1

我的產品。它的速度沒有保證,但它是O(n),理論上應該比你的方法更快。這在任何或所有情況下都可能並非如此。然而,如果你想要優化一些東西,你應該使用一個分析器來確保這是導致速度問題的函數,而不是試圖使代碼段快速執行,只佔執行時間的0.001%。 (在這種情況下,優化函數的最大增益爲0.001%)

$resources = $this->fetchAll(); 
$sortedresources = array(); 
foreach ($resources as $resource) { 

    $monthName = $resource->getDate()->get(Zend_Date::MONTH_NAME); 

    if (!isset($sortedresources[$monthName])){ 
     //setup new data for this month name 
     $month = new stdClass(); 
     $month->name = $monthName; 
     $month->monthResources = array(); 
     $sortedresources[$monthName] = $month; 
    } 

    $sortedresources[$monthName]->monthResources[] = $resource; 
} 
//return the values of the array, disregarding the keys 
//so turn array('feb' => 'obj') to array(0 => 'obj) 
return array_values($sortedresources); 
+0

是的。固定[15chars] – Yacoby 2009-12-21 18:03:04

+0

我只提到我希望優化它,因爲我能想到的唯一方法就是多次遍歷數組(我知道這可能不是必需的)。 – Andrew 2009-12-21 18:06:07

0

也許這有助於(僞代碼)

$finalArray = new array(); 
$tempStdClass = null; 

foreach ($resObj in $resources) 
{ 
    if ($tempStdClass == null) 
     $tempStdClass = new StdClass($resObj->date); 

    if (tempStdClass->monthName != $resObj->date) 
    { 
     array_push($finalArray, $tempStdClass); 
     $tempStdClass = new StdClass($resObj->date); 
    } 

    array_push($tempStdClass->monthResources, $resObj);  
}