2009-03-04 19 views
0

私は店舗の売り上げを表示するアプリを持っています。これは多次元配列なので、ルート配列内の各値は、それに関係する与えられた日の[sales],[cost][date]などを含む配列です。 OK、各店舗には2つの配列があります。 1つは検証済み番号用で、次は未検証番号用です。未確認のユーザーは、確認後すぐに取得されます。したがって、確認されていない最初の日付は確認されてから1日後になります。PHPで多次元配列を処理するにはどうすればよいですか?

OK、これまでのところすべて問題ありません。

しかし、私はすべての店舗の合計売上高を表示するには、合計を得るためにすべての検証済み番号と未確認番号を結合する必要があります。ここには難しい部分があります。検証された配列は、最も低い検証済みのストアの日付までしか上がらず、残りのすべては未検証でなければなりません。例:指定された日付で、すべての店舗で番号が確認されていても、その日付で未確認の店舗がある場合、その日付のすべての店舗は未確認である必要があります。したがって、検証された合計と未確認の合計を作成する必要があるように、各配列をチェックし、すべてが検証されている場合は検証された配列に追加し、そうでない場合は検証されていない配列を未検証の配列に追加します。

これは私が状況を説明するために最善を尽くしているからです。私は働いているアルゴリズムを持っていますが、それは非常に複雑なので、私はそれを研究するたびに勉強しなければなりません。もっと洗練されたソリューションがあることを期待していました。

ありがとうございました!ここで

は、配列構造は、これがダミーデータであるが、実際にはより多くのエントリが存在します

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

のように見えるものです。各店舗には2つの配列があります。両方の配列の日付は表示されません。日付は確認されていないか確認されているに過ぎません。

しかし、各店舗に対してこれらの配列のセットが複数あり、それらを組み合わせる必要がある場合、異なる店舗の未確認番号は異なる日付から始まります。 storeAは15日までに確認され、storeBは7日までに確認されます。だから私は新しい$verifiedと新しい店舗のすべてのものから新しい$unverifiedを構築する必要があります。しかし、異なる日付範囲にまたがっているため、すべての検証結果を単純に組み合わせることはできません。したがって、すべての日付が検証された場合、新しいマスター配列で検証されたままになりますが、検証されていないものがあれば、新しいマスター未検証配列に移動する必要があります。

これは私が申し訳ありませんので、しない場合。

+0

あなたの質問をより明確にするサンプルまたは疑似コードを投稿すると、視覚化が容易になります。 – jonstjohn

+0

合意しました...多分配列構造のprint_r()ですか? –

+0

結果はどうなりますか?全店舗の合計売上高または合計(日付を考慮して)$ verifiedおよび$ unverified array? – jfs

答えて

2

は、はるかに多くの場合、戦略的な 突破口は データや テーブルの表現をやり直すから来ます。これは、 プログラムの心臓部がある場所です。あなたのフローチャート を表示し、あなたのテーブルを隠すと、私は を神秘的に続けます。 テーブルを表示してください。通常はフローチャート は必要ありません。彼らは明らかになります。

-Frederick P.ブルックス・ジュニア、人月の神話を

私はあなたがすべての店舗の$total_verified$total_unverifiedのアレイを構築したいと仮定します。

  1. $earliest_unverified_dateで最も早い日付を追跡するすべての店舗の$total_unverified$unverifiedから配列を構築します。レコードは日付を持っており、他の$earliest_unverified_date$total_unverified配列に値を追加するよりも前である場合に限っ

  2. は、すべての店舗のため、各$verified配列から$total_verifiedに値を追加します。

1

問題は、リレーショナルデータベースが作成されたようなものです。データベースを使用していますか?その場合、GROUP BYまたはROLLUPを使用して適切なクエリ(または2つのクエリ)を実行すると、膨大な数のPHPを節約できます。

+0

+1:データが1つのデータベースにある場合、SQLの仕事になります。 – jfs

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 

毎回データベースから完全なデータセットを取得する必要はありません。

関連する問題