【问题标题】:PHP Make a multidimensional array from one mysql Row's columns?PHP从一个mysql Row的列创建一个多维数组?
【发布时间】:2011-12-08 20:35:05
【问题描述】:

我有以下 mysql 数据库行。

id | user_id | title_1|desc_1|link_1|title_2|desc_2|link_2| 

以此类推,最多 10 个

我想从这一行中删除 id 和 user id 并获得生成的多维数组。

主要问题是遍历我的查询返回的关联数组并将其拆分为 3 个数组。

Array = (

 [0] = array (
    [tite_1] => 'sometitle'
    [desc_1] => 'description'
    [link_1] => 'a link'
 )
  [1] = array (
    [tite_2] => 'sometitle'
    [desc_2] => 'description'
    [link_2] => 'a link'
 )

等等我怎么能做到这一点我很难过!!?

【问题讨论】:

  • 这是非常糟糕的数据库设计。您真的应该首先寻找一种更好的设计来适应这种情况。

标签: php mysql arrays multidimensional-array row


【解决方案1】:

您可能希望将您的表格构造成两个表格,如下所示:

parent(id, user_id, more_fields, whatever_you_need_here)

child(parent_id, title, desc, link)

现在很容易得到你想要的数据。

SELECT title, desc, link FROM child WHERE parent_id = 12;

当然,parentchild 应该适当命名,例如userlinks

【讨论】:

  • 为什么不在 1 数据库中有一个 parent_id 字段?
  • Michael、Jon、Middus、Kenaniah,你们都是对的。我已经开始对标准化进行研究,这是一个很好的建议,谢谢大家。唤醒 Kenaniah 表女巫只是一张表似乎是正确的做法,我不明白为什么我需要一个父表和一个孩子我想也许只有当我想告诉父母期望从孩子?大家觉得呢?
  • 在您当前的设计中,如果您需要第三个链接,即使是一个用户,您也必须 ALTER TABLE 并添加列。然后,如果您需要第四个链接,则必须再次 ALTER TABLE。如果您将链接存储在子表中,则更容易,因为您只需为每个用户添加任意​​数量的行。
  • @Stoosh 因为我不知道更多关于他的申请。它可能是一个包含用户名、电子邮件等或完全不同的用户表。
  • @BillKarwin 很好的解释!感谢您为我插话:)。
【解决方案2】:

正确的答案是重新设计您的数据库以使用第三范式。在进一步做任何事情之前,您可能应该放弃所有内容并阅读数据库规范化。

一个合适的设计应该是这样的:

 CREATE TABLE user_has_links (
   id INT PRIMARY KEY,
   user_id INT,
   title TEXT,
   description TEXT,
   link TEXT
 )

要为每个用户存储多个链接,您只需在此表中为每个链接创建一个新行。

【讨论】:

    【解决方案3】:

    这里真正的解决方案是修复您的数据库以将这些列规范化为其他表。但是,如果您无法修复数据库,则此代码将完成这项工作:

    // $output will hold your full result set
    $output = array();
    while ($row = mysql_fetch_assoc($result)) {
      // For each row returned, add a new array to $output
      $output[] = array(
        // The new array consists of 10 sub-arrays with the correct
        // keys and values
        array (
          "title"=>$row['title1'],
          "desc"=>$row['desc1'],
          "link"=>$row['link1']
        ),
        array (
          "title"=>$row['title2'],
          "desc"=>$row['desc2'],
          "link"=>$row['link2']
        ),
        ...,
        ...,
        array (
          "title"=>$row['title10'],
          "desc"=>$row['desc10'],
          "link"=>$row['link10']
        )
      );
    }
    

    【讨论】:

    • 不过,这是一个“繁文缛节”。如您所见,很容易把事情搞砸。一个错字和 boom ;)。正如 Michael、Jon 和其他人所说:如果可能的话,规范化你的数据库。
    • 抱歉,并发编辑出了点问题。我只是修复了/title1/title2,并不是要删除您的 cmets。
    • @middus 我修好了,没关系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2019-06-09
    • 2022-07-30
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多