【问题标题】:Create multidimensional arrays using single table使用单表创建多维数组
【发布时间】:2014-06-02 09:40:34
【问题描述】:

我有一张这样的桌子;

**Year**   **Month**
2012        Jan
2012        Mar
2012        Apr
2013        Dec
2013        Nov

我正在尝试从该表中创建一个类似于下面的数组;

Array
(
    [2012] => Array(
              Jan, Mar, Apr),
    [2013] => Array(
              Dec, Nov)
);

到目前为止,我尝试了这段代码,但没有得到我想要的,

    while ($row = mysql_fetch_array($result)){

          $new_array[] = array(
            'year' => $row['year'],
            'month' => $row['month'],
          );
}

【问题讨论】:

  • @krishna,你是对的,mysql_* 非常过时且不安全。事实上,它们已被弃用。这些函数对学习很有好处,但是一旦你了解了基础知识,你应该从一些框架中选择更安全的东西,比如 PDO 或 ORM。在最坏的情况下,你仍然可以使用 mysqli_* 函数,但我仍然不建议这样做。
  • @Megakuh 我认为你认为这是一个问题。它是一个了解为什么不应该使用 mysql_* 函数的链接。
  • @krishna,是的,我后来注意到了这一点并稍微纠正了自己:-)
  • @Megakuh mysqli 没问题。准备好的语句是关键。

标签: php mysql arrays multidimensional-array


【解决方案1】:

试试这个

while ($row = mysql_fetch_array($result)){
          $new_array[$row['year']][] = $row['month'];
}

【讨论】:

  • +1 我认为对于这个问题可以实现的最简单的解决方案
  • 我没有投反对票,但这是不正确的解决方案。如果在DATAbase层可以解决获取数据的问题,就应该这样解决。
  • @Megakuh 这不是获取数据的问题,而是存储检索到的数据的问题。
  • @Megakuh 你怎么能说不正确的解决方案你能解释一下吗?
  • @Sadikhasan,我已经这样做了。从语法等方面来看-您的建议是正确的。从软件设计的角度来看,在 DB 查询中使用 GROUP_CONCAT 函数更为可取。如果我对这样的任务进行代码审查,我会允许这两种解决方案,但如果我必须选择更好的一个,那么 DB 层的使用就在这里。
【解决方案2】:

更好的解决方案是使用 MySQL 的 GROUP_CONCATGROUP 创建每年一行的结果,然后使用 PHP 的 explodeGROUP_CONCATenated 值拆分为数组:

$query = mysql_query("SELECT `year`, GROUP_CONCAT(`month`) AS `months` FROM table GROUP BY `year`");
$new_array = array();
while ($row = mysql_fetch_array($result)) {
    $new_array[$row['year']] = explode(',', $row['months']);
}

【讨论】:

  • mysql_* 已弃用。你不应该建议 OP 使用它
  • @RahilWazir 我不会强迫 OP 使用它。它为他指定了一个很好的建议。在这里,我要提到回答这个问题的人。通常,当您使用已弃用的功能(但不说它已弃用)回答时,这是一个不好的解决方案
【解决方案3】:
$new_array=array();
while ($row = mysql_fetch_array($result)){

      if(!isset($new_array[$row['year']])
        $new_array[$row['year']]=array();

       $new_array[$row['year']] = array_push($new_array[$row['year']],$row['month']);
}

【讨论】:

    【解决方案4】:

    试试下面这行 在循环外创建数组。

     $newArray=array();
        while($row=mysql_fetch_array($(result))
        $newArray[$row['year']] = $row['month'];
    

    【讨论】:

    • 通过打印数组来检查我的答案。 foreach($newArray as $year => $month){ echo $year."=>".$month; }
    • 看到它的结果会像2012=> jan2012=> feb2013=> Dec。但 op 要求分别为 2012 年和 2013 年的所有月份创建一个数组
    【解决方案5】:

    将您的 while 循环更改为:

    while ($row = mysql_fetch_array($result)){
          $new_array[$row['year']][] = $row['month'];
    }
    

    【讨论】:

    • 我真的不介意投反对票,但解释一下会很有帮助。
    • 我在你第一次发帖时投了反对票,这是错误的(你错过了等号前的[]),现在除非你再次编辑,否则我删除为时已晚。
    • 是的,我看到我一按回车就马上改了。我猜你比我的编辑快:)。做了一个小修改,希望您现在可以撤消它。
    • 我的投票已撤消,但仍有其他人对您投了反对票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多