1

我在试图弄清楚如何在我的 Zend Framework 应用程序中实现这个编程挑战时遇到了麻烦:

我需要创建一个如下所示的数组:

$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) 已按日期(降序)排序,因此我需要创建一个数组,其中资源按月分组。我只想要有资源的月份,所以如果资源跳过一个月,那么stdClass最终数组中不应该有那个月的对象。

我也希望它能够快速处理,所以任何关于优化代码(并且仍然可读)的建议都会很棒。我怎样才能做到这一点?

4

2 回答 2

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);
于 2009-12-21T01:05:19.827 回答
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);    
}
于 2009-12-20T23:21:27.550 回答