2013-08-08 13 views
5

Ho una matrice multidimensionale.ottimizzazione del loop di array multidimensionale php

$count = count($main_array); // 6000+ 

Ogni elemento all'interno della matrice principale ha circa 25 tasti

$count_sub_array = count($main_array[0]); // 25 

ho circa 3000 valore unico per una delle chiavi. cioè

for($i=0; $i< $count; $i++){ 
    if($main_array[$i][$match]){ 
     array_push($unique_array,$main_array[$i][$match]); 
    } 
} 
$unique_array = array_unique($unique_array); // count - 3000 

desidero scorrere ogni elemento dell'array e raggrupparli tipo unico. E anche io desidero raggruppare gli elementi di cui al una delle indice specifico per esempio

$unique_index = array('2012-08','2012-07','2012-06','2012-05','2012-04','2012-03','2012-02', '2012-01'); 

#count di indice univoco al momento è 13

in modo che risultato è simile:

array (size=2689) 
0 => 
array (size=5) 
    'type' => string 'abc' (length=19) 
    'totalCost' => 
    array (size=13) 
     '2012-07-01' => float 790.08 
     '2012-08-01' => float 1501.84 
     '2012-09-01' => float 1568.9 
     '2012-10-01' => float 2756.04 
     '2012-11-01' => float 2428.42 
     '2012-12-01' => float 1901.09 
     '2013-01-01' => float 2538.59 
     '2013-02-01' => float 1537.57 
     '2013-03-01' => float 1674.51 
     '2013-04-01' => float 1141.01 
     '2013-05-01' => float 764.24 
     '2013-06-01' => float 1179.84 
     '2013-07-01' => float 1252.66 
    'numOrders' => 
    array (size=13) 
     '2012-07-01' => int 16 
     '2012-08-01' => int 66 
     '2012-09-01' => int 65 
     '2012-10-01' => int 59 
     '2012-11-01' => int 60 
     '2012-12-01' => int 47 
     '2013-01-01' => int 85 
     '2013-02-01' => int 50 
     '2013-03-01' => int 46 
     '2013-04-01' => int 41 
     '2013-05-01' => int 22 
     '2013-06-01' => int 32 
     '2013-07-01' => int 47 
    'TotalRevenue' => 
    array (size=13) 
     '2012-07-01' => float 1695.99 
     '2012-08-01' => float 7418.17 
     '2012-09-01' => float 7827.99 
     '2012-10-01' => float 7929.63 
     '2012-11-01' => float 4815.74 
     '2012-12-01' => float 5592.59 
     '2013-01-01' => float 6874.02 
     '2013-02-01' => float 11599.49 
     '2013-03-01' => float 10358.57 
     '2013-04-01' => float 6909.55 
     '2013-05-01' => float 6983.38 
     '2013-06-01' => float 7211.84 
     '2013-07-01' => float 10422.59 
    'profit' => 
    array (size=13) 
     '2012-07-01' => float 905.91 
     '2012-08-01' => float 5916.33 
     '2012-09-01' => float 6259.09 
     '2012-10-01' => float 5173.59 
     '2012-11-01' => float 2387.32 
     '2012-12-01' => float 3691.5 
     '2013-01-01' => float 4335.43 
     '2013-02-01' => float 10061.92 
     '2013-03-01' => float 8684.06 
     '2013-04-01' => float 5768.54 
     '2013-05-01' => float 6219.14 
     '2013-06-01' => float 6032 
     '2013-07-01' => float 9169.93 
1 => 
array (size=5) 
    'type' => string 'bcd' (length=26) 
    'totalCost' => 
    array (size=13) 
     '2012-07-01' => float 599.53 
     '2012-08-01' => float 419.18 
     '2012-09-01' => float 212.63 
     '2012-10-01' => float 462.55 
     '2012-11-01' => float 450.08 
     '2012-12-01' => float 447.1 
     '2013-01-01' => float 657 
     '2013-02-01' => float 734.68 
     '2013-03-01' => float 1006.91 
     '2013-04-01' => float 1497.95 
     '2013-05-01' => float 2100.96 
     '2013-06-01' => float 3845.33 
     '2013-07-01' => float 6817.38 
    'numOrders' => 
    array (size=13) 
     '2012-07-01' => int 11 
     '2012-08-01' => int 33 
     '2012-09-01' => int 25 
     '2012-10-01' => int 28 
     '2012-11-01' => int 33 
     '2012-12-01' => int 28 
     '2013-01-01' => int 33 
     '2013-02-01' => int 45 
     '2013-03-01' => int 54 
     '2013-04-01' => int 53 
     '2013-05-01' => int 69 
     '2013-06-01' => int 91 
     '2013-07-01' => int 180 
    'TotalRevenue' => 
    array (size=13) 
     '2012-07-01' => float 1201.32 
     '2012-08-01' => float 4889.65 
     '2012-09-01' => float 2171.5 
     '2012-10-01' => float 2573.75 
     '2012-11-01' => float 2375.1 
     '2012-12-01' => float 2807.28 
     '2013-01-01' => float 2933.05 
     '2013-02-01' => float 5534.61 
     '2013-03-01' => float 6946.02 
     '2013-04-01' => float 8555.78 
     '2013-05-01' => float 8202.32 
     '2013-06-01' => float 14140.04 
     '2013-07-01' => float 22043.54 
    'profit' => 
    array (size=13) 
     '2012-07-01' => float 601.79 
     '2012-08-01' => float 4470.47 
     '2012-09-01' => float 1958.87 
     '2012-10-01' => float 2111.2 
     '2012-11-01' => float 1925.02 
     '2012-12-01' => float 2360.18 
     '2013-01-01' => float 2276.05 
     '2013-02-01' => float 4799.93 
     '2013-03-01' => float 5939.11 
     '2013-04-01' => float 7057.83 
     '2013-05-01' => float 6101.36 
     '2013-06-01' => float 10294.71 
     '2013-07-01' => float 15226.16 
); 

Come posso ottimizzare il ciclo?

Attualmente ho la seguente logica:

1. get the main array from mysql 
2. get unique elements 
3. foreach unique element 
     a. foreach key like '2013-06-01', '2013-07-01' 
     b. foreach main array 
       match above key i.e. if($time == '2013-06-01') 
     c. get $value['totalCost'], $value['numOrders'], $value['profit'], value['revenue'] 

Secondo me, complessità di questo ciclo è: 3000 * 13 * 6000;

Grazie per l'aiuto in anticipo.

+0

Hai detto che questi dati provengono da SQL, hai provato a fare parte del raggruppamento e dell'elaborazione nella tua query di database? –

+0

Sì, è già raggruppato Ecco perché ho dovuto ottenere un array univoco per formare un array nella struttura sopra. – Gaurav

+0

Dopo aver passato molto tempo a guardare il tuo esempio, non sono ancora sicuro di come siano i tuoi dati iniziali (nel database).Se lo sapessi, o almeno avessi un esempio migliore di come è il tuo set di risultati (array iniziale), credo che potrei scrivere una query sql che consentirà di scrivere l'array di output in un ciclo con un loop condizionale. Perché non hai bisogno dei passaggi 2 e 3a e l'intero 3 è solo una volta 3.b ma con una corrispondenza più intelligente – Konstantin

risposta

0

È necessario eseguire il ciclo 3 volte in ogni caso, ma scegliere bene i loop.

Poiché l'array principale è il più grande, si desidera eseguire il ciclo solo una volta. Invece di costruire prima l'array date, lo si costruisce e lo si riempie man mano che si esegue il looping dell'array principale.

  1. ottenere la matrice principale da mysql
  2. ciclo solo una volta

    $dates = array(); 
    $measures = array(
        'totalCost' => 0, 
        'numOrders' => 0, 
        'TotalRevenue' => 0, 
        'profit'  => 0 
    ); 
    foreach ($main as $main_element) { 
        foreach (array_keys($measures) as $measure) { 
         foreach ($main_element[$measure] as $date => $value) { 
          if(!isset($dates[$date])) { 
           $dates[$date] = $measures; 
          } 
          $dates[$date][$measure] += $value; 
         } 
        } 
    } 
    

Nota: A seconda delle vostre preferenze per la struttura del risultato, è possibile sostituire

$dates[$date][$measure] 

di

$dates[$measure][$date] 

Hai ancora 3 loop, ma esegui solo il ciclo 6000 * 4 * 13 volte, che è molto meglio.

+0

Grazie. ma questo non significa, ho una matrice unica. Poiché l'iterazione 6000 è il ciclo principale .. e 3000 sono soluzioni uniche. ora ho bisogno di raggruppare elementi unici nel modo detto .. che significa .. 3000 volte ho bisogno di trovare per ogni data e misurare il valore della combinazione dalla matrice principale altrimenti assegnare uno 0 come valore – Gaurav

+0

Questo è quello che sto facendo. Potete per favore darmi la struttura della matrice di risultati? Questo mi aiuterà a capire in quale punto la mia soluzione non è sufficiente. –

+0

Grazie. Ho ottimizzato il processo completo usando memcache. Inserirò presto un array campione per te. Resta con me fino ad allora. – Gaurav

0

Ho utilizzato l'estensione php memcached per risolvere il problema. Con il risultato la prima volta ci vuole il tempo consueto, ma più tardi viene eseguito più velocemente una volta che la chiave di cache è stata trovata sul server memcached.

Problemi correlati