0

我有一个显示商店销售的应用程序。它是一个多维数组,因此根数组中的每个值都是一个数组,其中包含它所属的给定日期的 、 、[sales][cost][date]好的,每个商店都有 2 个数组。一个用于已验证的号码,下一个用于未验证的号码。未验证的会在验证后立即领取,因此未验证的第一个日期将是验证后的一天。

好的,到目前为止这一切都很好。

但是当我显示所有商店的总销售额时,我需要将所有已验证和所有未验证的数字结合起来得到总数。这是棘手的部分。经过验证的数组应该只到最低验证商店的日期,其余的都应该是未经验证的。例如:在给定日期,如果所有商店都有已验证的号码,但有一个在该日期未验证,那么它们都需要在该日期未验证。所以这就像它需要创建一个已验证的总数和一个未验证的总数,检查每个数组,如果它们都已验证,则添加到已验证的数组,否则如果有任何未验证的添加到未验证的数组。

我希望这是因为,我正在尽力解释这种情况。我确实有一个有效的算法,但它太复杂了,我每次研究它时都必须永远研究它,我希望有一个更优雅的解决方案。

谢谢!!!

这是数组结构的样子

$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但我不能简单地结合所有验证,因为它们跨越不同的日期范围。因此,如果所有日期都已验证,那么它们会在新的主阵列中保持验证,但如果有任何日期未验证,则它们需要转到新的未验证主阵列。

如果这不成功,我很抱歉。

4

3 回答 3

2

更多时候,战略突破将来自重做数据或表格的表示。这是程序的核心所在。给我看你的流程图并隐藏你的表格,我会继续被迷惑。给我看你的表格,我通常不需要你的流程图;他们会很明显。

——小弗雷德里克·P·布鲁克斯,神话人物月

我假设您想为所有商店构建$total_verified$total_unverified数组。

  1. $total_unverified从数组构造$unverified所有商店,跟踪$earliest_unverified_date.

  2. 从每个$verified数组中为所有商店添加值以$total_verifiediff 记录具有日期并且它早于$earliest_unverified_date将值添加到$total_unverified数组中。

于 2009-03-04T22:14:32.760 回答
1

您的问题听起来像是关系数据库的用途。你在使用数据库吗?如果是这样,一个适当的查询(或两个查询)使用GROUP BYorROLLUP可以为您节省大量的 PHP 行。

于 2009-03-04T23:42:03.563 回答
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

为您提供所需的销售总额 - 无需每次都从数据库中提取完整的数据集!

于 2009-03-05T01:17:17.890 回答