【问题标题】:How do I best process my multi-dimensional arrays in PHP?如何在 PHP 中最好地处理我的多维数组?
【发布时间】:2010-10-11 09:19:20
【问题描述】:

我有一个显示商店销售的应用。它是一个多维数组,因此根数组中的每个值都是一个包含[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 中构建一个新的$unverified。但我不能简单地结合所有验证,因为它们跨越不同的日期范围。因此,如果所有日期都已验证,则它们会在新的主数组中保持验证状态,但如果有任何日期未验证,则需要转到新的未验证主数组。

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

【问题讨论】:

  • 发布一些示例或伪代码,让您的问题更清晰 - 这样更容易可视化。
  • 同意...也许是数组结构的 print_r()?
  • 结果是什么:所有商店的总销售额或组合(考虑日期)$verified 和 $unverified 数组?

标签: php arrays multidimensional-array


【解决方案1】:

更多时候是战略性的 突破将来自重做 数据的表示或 表。这是一颗心的地方 程序的谎言。给我看你的流程图 把你的桌子藏起来,我会 继续被迷惑。给我看一下你的 桌子,我通常不需要你的 流程图;它们会很明显。

—Frederick P. Brooks, Jr.,神话人物月

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

  1. 根据$unverified 数组为所有商店构造$total_unverified,以跟踪$earliest_unverified_date 中的最早日期。

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

    李>

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1:如果数据在一个数据库中,那将是 SQL 的工作。
    【解决方案3】:

    我假设您是从数据库中提取所有这些数字 (如果没有,为什么不呢?), 并且您的数据库看起来像

    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
    

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

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2011-01-16
      • 2016-02-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多