PHP цикл, задача сортировки дат

У меня возникли проблемы при попытке выяснить, как решить эту проблему программирования в моем приложении 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 Объект для этого месяца в окончательном массиве.

Я также хочу, чтобы это обрабатывалось быстро, поэтому любой совет по оптимизации кода (и все еще читабельный) был бы полезен. Как мне этого добиться?

2 ответа

Решение

Мой предложение. Нет никаких гарантий относительно его скорости, однако это 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);

Может быть, это помогает (псевдокод)

$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);    
}
Другие вопросы по тегам