2009-03-04 111 views
0

我有一個顯示商店銷售的應用程序。它是一個多維數組,因此根數組中的每個值都是一個包含[sales],[cost],[date]等的數組,在它所屬的給定日期內。好的,每個商店有兩個數組。一個用於驗證號碼,另一個用於未經驗證的號碼。未經覈實的未經覈實的核對,所以未覈實的第一個日期將在覈實後的一天。 OK,這一切都很好。如何在PHP中最好地處理我的多維數組?

但是,當我顯示所有商店的總銷售額時,我需要合併所有經過驗證的數據和所有未經驗證的數字以獲得總數。這是棘手的部分。經過驗證的陣列只能上到最低驗證商店的日期,其餘所有應該未驗證。例如:在給定的日期,如果所有商店都有驗證號碼,但有一個未經驗證,那麼它們都需要在該日期未經驗證。因此,它需要創建一個已驗證的總數和一個未驗證的總數,檢查每個數組,如果它們全部驗證添加到已驗證的數組中,否則如果有未驗證的數組添加到未驗證的數組。

我希望這樣做以後,我正在盡力解釋這種情況。我確實有一種運算法則,但它非常複雜,我每次工作時都要永遠研究它,而且我希望有一個更優雅的解決方案。

謝謝!

這裏是陣列結構的樣子

$verified ( 
    [0](sales => 355, cost=> 233, date=> 2008-03-01) 
    [0](sales => 235, cost=> 133, date=> 2008-03-02) 
    [0](sales => 435, cost=> 143, date=> 2008-03-02) 
) 
$unverified ( 
     [0](sales => 232, cost=> 133, date=> 2008-03-03) 
     [0](sales => 335, cost=> 233, date=> 2008-03-04) 
     [0](sales => 535, cost=> 243, date=> 2008-03-05) 
    ) 

這是虛擬數據,但在現實中會有更多的條目。每個商店都有這兩個數組。這個日期不會出現在兩個陣列上;日期只會未經驗證或驗證。

但是,當您爲每個商店有幾組這些陣列並需要將它們組合時,不同商店的未經驗證的數字將從不同的日期開始。 storeA可能會在15日前驗證,storeB可能會在7日前驗證。所以我需要爲每個商店建立一個新的$verified和一個新的$unverified。但我不能簡單地合併所有已驗證的內容,因爲它們跨越不同的日期範圍。所以如果所有日期都被驗證,那麼它們會在新的主數組中保持驗證狀態,但是如果有未驗證的日期,他們需要轉到新的未驗證主數組。

如果這樣做並不令我感到抱歉。

+0

發佈一些樣例或僞代碼,可以讓您的問題更清晰 - 這樣可以更容易直觀化。 – jonstjohn 2009-03-04 21:54:57

+0

同意......也許是一個print_r()的數組結構? – 2009-03-04 22:00:05

回答

2

更加頻繁,戰略 突破將來自重做 數據或 表的表示。這是 計劃的核心所在。讓我看看你的流程圖 並隱藏你的表格,我會 繼續迷惑。讓我看看你的 表格,我通常不需要你的 流程圖;他們會很明顯。

-Frederick布魯克斯,小,人月神話

我假設你想構建$total_verified$total_unverified陣列的所有門店。

  1. 構建$total_unverified$unverified陣列用於跟蹤的最早日期的$earliest_unverified_date所有商店。從各$verified陣列的所有門店$total_verified當且僅當記錄

  2. 增加價值有日期,它是早於其他$earliest_unverified_date的價值添加到$total_unverified陣列。

1

你的問題聽起來像是關係數據庫的東西。你在使用數據庫嗎?如果是這樣,使用GROUP BYROLLUP的適當查詢(或兩個查詢)可以爲您節省bazillion的PHP線。

1

我假設你是從數據庫 拉動所有這些數字(如果沒有,爲什麼不呢?), 和您的數據庫看起來像

TABLE SalesSummary 

Id StoreId Date  SalesTotal CostTotal Verified 
... 
231 1  2008-03-01 355.00  233.00  true 
232 2  2008-03-01 299.00  233.00  true 
233 1  2008-03-02 235.00  133.00  false 
234 2  2008-03-02 335.00  133.00  true 
235 1  2008-03-03 435.00  143.00  false 
236 2  2008-03-03 319.00  143.00  false 

然後

SELECT MIN(Date) AS FirstUnverifiedDate FROM SalesSummary WHERE Verified=false 

認定第一個未驗證的日期,並且

SELECT 
    (Date < $FirstUnverifiedDate) AS Verified, 
    StoreId, 
    SUM(SalesTotal) AS SalesSum, 
    SUM(CostTotal) AS CostSum 
FROM 
    SalesSummary 
WHERE 
    Date >= $BeginningOfMonth 
GROUP BY 
    (Date < $FirstUnverifiedDate) DESC, 
    StoreId ASC 

讓你您想要的銷售總額 - 無需每次都從數據庫中提取完整數據集!