PHP döngü, tarih sıralama meydan

2 Cevap php

Ben sorun benim Zend Framework uygulamasında bu programlama zorluğu başarmak için nasıl anlamaya çalışıyorum yaşıyorum:

Şöyle bir dizi oluşturmak gerekir:

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

Bu benim ile çalışmak zorunda orijinal dizidir:

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

Orijinal dizi ($resources) zaten (azalan) tarihe göre sıralanır yüzden kaynaklar aya göre gruplandırılmış bir dizi oluşturmak gerekir. Ben sadece kaynaklara sahip ay istiyorsanız, bu nedenle kaynakların bir ay atlarsanız, son dizideki o ay için stdClass nesnesi olmamalıdır.

Ben de bu hızla işlemek isteyen, bu yüzden kod optimize (ve hala okunabilir olmak üzere) herhangi bir tavsiye çok iyi olurdu. Bunu nasıl başarabiliriz?

2 Cevap

Benim sunan. Ancak onun hızına hiçbir garanti O (n) ve teorik yöntem daha hızlı olmalıdır. Bu, herhangi bir ya da her durumda doğru olmayabilir. Optimize edilmiş bir şey istiyorsanız Ancak bu oldukça sadece yürütme zamanı 0,001% hesaba zaman hızlı kod bölümlerini yapmaya çalışırken daha hız sorunlara neden olan fonksiyon olduğundan emin olmak için bir profiler kullanılmış olmalıdır. (Bu durumda fonksiyonunu optimize gelen maksimum kazanç .001% olurdu)

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

Belki bu yardımcı olur (pseudo-code)

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