【问题标题】:PHP Create Multilayer array of years and monthsPHP 创建年月的多层数组
【发布时间】:2017-07-19 23:35:29
【问题描述】:

我一直在尝试为 MySQL 数据库创建一个简单的前端,它将显示分隔为年和月目录的表。

我想要的是一个年份数组,每年都有一个月份的子数组,每个月都有一个表名的子数组,其中日期列中包含该年份和月份。

类似:

2017 {
    01 {
        Table01
        Table02
    }
    02 {
        Table03
        Table04
    }
}

创建这种数组结构的最佳方法是什么?我对多级数组没有太多经验。

我已经得到了一个仅包含 MySQL 表中年份的简单数组,所以我只需要在其中添加月份,然后在后面添加表名。

MySQL 中的每个表都被命名为_ProductID,ID 是一个六位数字。它包含给定月份该产品的所有订单的列表。因此,对于 2017 年 1 月,ID/表名称可能是 _123456,但对于 2 月,它将是 _123457。

每个表都有一个 Ordered_On 列,日期格式为 YYYY-MM-DD,因此我选择使用贯穿所有表的 foreach 语句的年份:

foreach($tables as $table) {
    $year = mysqli_query($connect, "SELECT ORDERED_ON FROM $table LIMIT 1")
    ->fetch_array()[0];

    if(!in_array(explode('-', $year)[0], $years, true)) {
        array_push($years, explode('-', $year)[0]);
    }
}

【问题讨论】:

  • 给我们一些关于你在 mysql 中的表的信息。以及您如何实际检索它们。
  • 您必须向我们展示您的代码。
  • 我添加了一些关于表格的更多信息,以及我如何创建仅相关年份的数组,如果有用的话。

标签: php arrays multidimensional-array


【解决方案1】:

您应该利用“strtotime”,它是 PHP 中一个非常强大的功能。它允许您转换日期并使用 date() 函数对其进行操作,如下所示。 最重要的是,PHP 关联数组非常容易动态创建。由于您一次只添加一个元素,因此不需要 array_push。

foreach($tables as $table) {
   $year = mysqli_query($connect, "SELECT ORDERED_ON FROM $table LIMIT 1")
->fetch_array()[0];

    $year = date("Y",strtotime($year));
    $month = date("m",strtotime($year));

    $years[$year][$month][] = $table;
}

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我设法弄清楚如何实现我想要的。我首先运行了一个 mysqli_query 来收集所有表名并将它们添加到一个数组中,然后我使用一个 foreach 循环遍历每个表并将其添加到整个日期数组中:

    $structure = [];
    
    foreach($wowcherTables as $tableName) { 
        $redeemed = mysqli_query($connect, "SELECT Redeemed_At FROM wowcher.$tableName LIMIT 1")
                    ->fetch_array()[0];
    
        $year = explode('-', $redeemed)[0];
        $month = explode('-', $redeemed)[1];
    
        $structure[$year][$month] = array();
    }
    

    第一个 foreach 语句从每个表的第一行获取年份和月份,并将它们创建为 $structure 数组中的层。

    然后我必须执行一个相同的 foreach 语句来使用 array_push 将每个表名添加到数组中,因为由于某种原因,当我在单个 foreach 中只使用 array_push 时,每个月只会添加一个表名。

    foreach($wowcherTables as $tableName) { 
        $redeemed = mysqli_query($connect, "SELECT Redeemed_At FROM wowcher.$tableName LIMIT 1")
                    ->fetch_array()[0];
    
        $year = explode('-', $redeemed)[0];
        $month = explode('-', $redeemed)[1];
    
        array_push($structure[$year][$month], $tableName);
    }
    

    如果有人可以向我解释发生这种情况的原因以及添加表的更有效方法,那将非常有用,因为拥有两个相同的 foreach 语句似乎过多且不必要。

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多