2013-08-08 48 views
5

Tôi có một mảng đa chiều.tối ưu hóa vòng lặp mảng đa chiều php

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

Mỗi phần tử bên trong các mảng chính có khoảng 25 phím

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

Tôi có khoảng 3000 giá trị duy nhất cho một trong những chìa khóa. tức là

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 

Tôi muốn lặp qua từng phần tử trong mảng và nhóm chúng theo loại duy nhất. Và tôi cũng muốn nhóm các yếu tố theo một trong những chỉ số cụ thể ví dụ

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

chépCOUNT của chỉ số duy nhất hiện nay là 13

nên kết quả đó trông giống như:

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

Làm thế nào tôi có thể tối ưu hóa vòng lặp?

hiện tại tôi có logic sau tại:

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'] 

Theo tôi, phức tạp của vòng này là: 3000 * 13 * 6000;

Cảm ơn bạn đã trợ giúp trước.

+0

Bạn đề cập rằng dữ liệu này đến từ SQL, bạn đã thử thực hiện một số nhóm và xử lý trong truy vấn cơ sở dữ liệu của mình chưa? –

+0

Có, nhóm đã được nhóm của nó đó là lý do tại sao tôi phải lấy mảng duy nhất để tạo thành mảng trong cấu trúc trên. – Gaurav

+0

Sau khi dành thời gian dài nhìn vào ví dụ của bạn tôi vẫn không chắc chắn những gì dữ liệu ban đầu của bạn (trong cơ sở dữ liệu) trông giống như.Nếu tôi biết rằng, hoặc ít nhất có một ví dụ tốt hơn về những gì kết quả của bạn thiết lập (mảng ban đầu) trông giống như, tôi tin rằng tôi có thể viết một truy vấn sql sẽ cho phép viết mảng đầu ra của bạn trong một vòng lặp với một witin có điều kiện vòng lặp đó. Bởi vì bạn không cần bước 2 và 3a chút nào và toàn bộ 3 chỉ là một lần 3.b nhưng với kết hợp thông minh hơn – Konstantin

Trả lời

0

Bạn cần phải lặp lại 3 lần, nhưng cũng chọn vòng của bạn.

Vì mảng chính là lớn nhất, bạn chỉ muốn lặp một lần. Thay vì xây dựng mảng ngày đầu tiên, bạn xây dựng và điền vào nó khi bạn lặp lại mảng chính.

  1. có được mảng chính từ mysql
  2. vòng chỉ một lần

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

Lưu ý: Tùy thuộc vào sở thích của bạn cho cấu trúc của kết quả, bạn có thể thay thế

$dates[$date][$measure] 

bởi

$dates[$measure][$date] 

Bạn vẫn có 3 vòng, nhưng bạn chỉ lặp lại 6000 * 4 * 13 lần, điều này tốt hơn nhiều.

+0

Cảm ơn bạn. nhưng điều đó không có nghĩa là tôi có một mảng duy nhất. Kể từ 6000 lặp là vòng lặp chính .. và 3000 là giải pháp duy nhất. bây giờ tôi cần phải nhóm các yếu tố độc đáo trong thời trang nói .. có nghĩa là .. 3000 lần tôi cần phải tìm cho mỗi ngày và đo giá trị kết hợp từ mảng chính khác chỉ định một 0 là giá trị – Gaurav

+0

Đó là những gì tôi đang làm. Bạn có thể cho tôi cấu trúc của mảng kết quả không? Điều này sẽ giúp tôi hiểu tại điểm nào giải pháp của tôi là không đủ. –

+0

Cảm ơn. Tôi đã tối ưu hóa quá trình hoàn chỉnh bằng memcache. Tôi sẽ gửi một mảng mẫu cho bạn sớm. Chịu với tôi cho đến lúc đó. – Gaurav

0

Tôi đã sử dụng tiện ích mở rộng memcached php để giải quyết vấn đề. Với kết quả lần đầu tiên phải mất thời gian bình thường tuy nhiên sau đó nó thực hiện nhanh hơn khi khóa bộ nhớ cache được tìm thấy trên máy chủ memcached.

Các vấn đề liên quan