2009-12-20 4 views
1

Je vais avoir du mal à essayer de comprendre comment atteindre ce défi de programmation dans mon application Zend Framework:boucle PHP, le défi de tri date

Je dois créer un tableau qui ressemble à ceci:

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

est le tableau original, je dois travailler avec:

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

le tableau original ($resources) est déjà trié par date (décroissant) donc je dois créer un tableau w ici les ressources sont regroupées par mois. Je veux seulement les mois qui ont des ressources, donc si les ressources sautent un mois, il ne devrait pas y avoir un objet stdClass pour ce mois dans le tableau final. Je veux aussi que cela se fasse rapidement, donc tout conseil pour optimiser le code (et être toujours lisible) serait génial. Comment puis-je atteindre cet objectif?

+2

Il serait utile de voir le code pour 'Resource_Object()', ou la réponse sera trop générique. – kiamlaluno

Répondre

1

Mon offre. Aucune garantie sur sa vitesse mais il est O (n) et devrait en théorie être plus rapide que votre méthode. Cela peut ne pas être vrai dans tous les cas. Cependant, si vous voulez quelque chose d'optimisé, vous devriez utiliser un profileur pour vous assurer que c'est la fonction qui cause les problèmes de vitesse plutôt que d'essayer de faire des sections de code rapide quand elles ne représentent que 0,001% du temps d'exécution. (Dans ce cas, le gain maximal de l'optimisation de la fonction serait .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

Oui. Fixe [15chars] – Yacoby

+0

J'ai seulement mentionné que je voulais l'optimiser car la seule façon de le faire serait d'itérer plusieurs fois dans le tableau (ce que je savais probablement n'était pas nécessaire). – Andrew

0

Peut-être que cela aide (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);  
}