如何将嵌套/多维数组中的值存储在MySQL数据库中?

时间:2011-06-28 08:58:24

标签: php mysql arrays multidimensional-array

我的数组看起来像这样:

Array  
(  
[0] => Array
    (
        [created_at] => Sat Jun 25 21:22:20 +0000 2011
        [text] => i'm eating apple
        [sender] => Array
            (
                [name] => mark o
                [created_at] => Wed May 28 18:21:03 +0000 2008
            )
        [recipient] => Array
            (
                [created_at] => Mon Jun 21 19:48:50 +0000 2010
                [screen_name] => playassassin
            )
        [sender_screen_name] => mark
        [recipient_screen_name] => james
    )

[1] => Array
    (
        [created_at] => Mon Jun 20 10:52:37 +0000 2011
        [text] => My bday in 5 minutes
        [sender] => Array
            (
                [name] => mark o
                [created_at] => Wed May 28 18:21:03 +0000 2008
            )
        [recipient] => Array
            (
                [created_at] => Mon Jun 21 19:48:50 +0000 2010
                [screen_name] => james
            )
        [sender_screen_name] => mark
        [recipient_screen_name] => james
    )  
)  

这是来自Twitter API的直接消息提要的简化版本。我将使用PHP和twitter-async库每隔X分钟请求最新的DM,然后我想将数据的一部分存储在数据库表中。每个DM应存储在自己的行中 数据将存储在表中:

CREATE TABLE `dms` (
    `postid` INT(12) NOT NULL,
    `text` VARCHAR(140) NOT NULL COLLATE 'utf8_unicode_ci',
    `sender` VARCHAR(20) NOT NULL COLLATE 'utf8_unicode_ci',
    `sender_id` VARCHAR(20) NOT NULL COLLATE 'utf8_unicode_ci',
    `date_created` DATETIME NOT NULL
)

我真的不知道如何去做这件事,非常感谢一些帮助。

如果它简化了事情,我只需要从第二层中提取值。另外,我不知道我将添加多少行。


我一直在搞乱,这段代码几乎可以满足我的需求:

foreach ( $adms as $dm ) {

    foreach ( $dm as $key => $value ) {
        $q = "INSERT INTO dms SET text = '{$value}'";
        mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
  }

}

当然,这只是将每个第二级值存储在“text”列的新行中。如果你可以帮助我完成它以完成我的要求,我会标记你的答案。

3 个答案:

答案 0 :(得分:2)

嗯......你只输入一个值。

尝试这样的事情: -

foreach ( $adms as $dm ) {
    $q = "INSERT INTO dms(text, sender, sender_id, date_created) values('".$dm["text"]."', '".$dm["sender_screen_name"]."', '".$dm["sender"]["name"]."', now())";
    mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
}

答案 1 :(得分:1)

定义一个parent_postid,所以插入父,获取它的id并在parent_postid中插入带有该id的子记录

CREATE TABLE `dms` (
    `postid` INT(12) NOT NULL,
    `parent_postid` INT(12) NOT NULL,
    `text` VARCHAR(140) NOT NULL COLLATE 'utf8_unicode_ci',
    `sender` VARCHAR(20) NOT NULL COLLATE 'utf8_unicode_ci',
    `sender_id` VARCHAR(20) NOT NULL COLLATE 'utf8_unicode_ci',
    `date_created` DATETIME NOT NULL
)

这可以对许多n级进行...并且每个子可以是父级等等......

答案 2 :(得分:0)

您想要实现的目标也称为粉碎,例如xml粉碎。基本思想是将您的数组想象成一棵树。将信息作为树存储后,可以将每个节点存储在线性表中。与每个节点(即包含的信息)一起,您可以存储其父/子关系以及恢复初始结构所需的任何内容。