如何在PHP中最好地处理我的多维数组?

时间:2009-03-04 21:52:31

标签: php arrays multidimensional-array

我有一个显示商店销售的应用。它是一个多维数组,因此根数组中的每个值都是一个包含[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)
    )

这是虚拟数据,但实际上会有更多条目。每个商店都有这两个数组。两个阵列都不会显示日期;日期只能在未经验证或验证的情况下使用。

但是当你为每个商店设置了几组这些数组并需要将它们组合起来时,不同商店的未经验证的数字将在不同的日期开始。 storeA可以在15日前进行验证,storeB可以在7日前进行验证。所以我需要为每个商店的所有商店构建一个新的$verified和一个新的$unverified。但我不能简单地将所有已验证的内容组合在一起,因为它们跨越不同的日期范围。因此,如果验证了所有日期,那么它们将在新的主数组中保持验证状态,但如果未验证任何日期,则需要转到新的未经验证的主数组。

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

3 个答案:

答案 0 :(得分:2)

  

更常见的是,战略性的   突破将来自重做   数据的表示或   表。这是一个心脏的地方   程序谎言。告诉我你的流程图   并隐藏你的桌子,我会   继续神秘。给我看你的   桌子,我通常不需要你的   流程图;他们会很明显。

-Frederick P. Brooks,Jr。,The Mythical Man-Month

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

  1. 从所有商店的$total_unverified数组构建$unverified,跟踪$earliest_unverified_date中的最早日期。

  2. 如果记录有日期且早于$verified,则将所有商店的每个$total_verified数组的值添加到$earliest_unverified_date,否则将值添加到$total_unverified阵列

答案 1 :(得分:1)

你的问题听起来就像关系数据库那样。你在使用数据库吗?如果是这样,使用GROUP BYROLLUP的正确查询(或两个查询)可以为您节省大量的PHP。

答案 2 :(得分: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

获取您想要的销售总额 - 无需每次都从数据库中提取完整数据集!