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);
}