2013-03-28 59 views
0

我有一个5级多维数组。数组中的键数量会波动,但我需要将其存储在数据库中,以便稍后使用PHP访问它。有没有简单的方法来做到这一点?将数组存储在MySQL表中

我的想法是使用几个不同的分隔符(如#*%*)将数组转换为单个字符串,然后在需要时使用一系列explode()将数据转换回数组。

我现在还没有写任何代码,因为我希望有更好的方法来做到这一点。但我有我试过下面勾勒出一个潜在的解决方案:

这里是我的阵列的概述:

n=button number 
i=item number 
btn[n][0]    = button name 
btn[n][1]    = button desc 
btn[n][2]    = success or not (Y or N) 
btn[n][3]    = array containing item info 
    btn[n][3][i][0]  = item intput type (Default/Preset/UserTxt/UserDD) 
    btn[n][3][i][1]  = array containing item value - if more than one index then display as drop down 

这是我打算用分隔符的破败:

#*Button Title      //button title 
    &*val1=*usr1234     //items and values 
    &*val2=*FROM_USER(_TEXT_$*name:)  //if an items value contains "FROM_USER" then extract the data between the perenthesis 
    &*val3=*FROM_USER(_TEXT_$*Time:)  //if the datatype contains _TEXT_ then explode AGAIN by $* and just display a textfield with the title 
    &*val4=*FROM_USER($*[email protected]*value1$*[email protected]*value2)  //else explode AGAIN by $* for a list of name value pairs which represent a drop box - [email protected]*value2 

//sample string - a single button 
#*Button Title%*val1=*usr1234&*val2=*FROM_USER(_TEXT_$*name:)&*val3=*FROM_USER(_TEXT_$*date:)&*val4=*FROM_USER($*[email protected]*value1$*[email protected]*value2) 

我希望这是有道理的。无论哪种方式。如果任何人都可以给我一些关于如何在单个数据库表中存储多维数组的想法,我会非常感激。

+0

你可以在单个表中使用子父关系想要在行级别存储或者你可以将你的数组编码到json中。 – Neo 2013-03-28 09:31:37

+1

你可以json_encode并保存该字符串。 – Ryoku 2013-03-28 09:32:08

+2

你可以使用PHP的序列化/反序列化将数组转换为/从字符串 – 2013-03-28 09:33:03

回答

4

你想要的是一个data serialization方法。不要自己创造,已经有很多了。最明显的候选人是JSON(json_encode)或PHP特定的serialize。 XML也是一种选择,特别是如果您的数据库可能在某种程度上本地支持它。

+0

序列化是完美的!我不相信我真的会去做所有这些工作。你只是挽救了我几个小时的生活。 – 2013-03-28 09:53:22

+0

请注意,PHP的序列化格式几乎不受PHP支持。为了尽可能保持数据存储在数据库中,我更喜欢JSON。 – deceze 2013-03-28 09:56:42

+0

谢谢,但没关系。这个项目我没有使用PHP以外的其他任何东西。 – 2013-03-28 09:58:16

0

您的最佳决定是json_encode

它对序列化旁边的json_encode存储在db中有一些优点。

  1. 以更小的尺寸
  2. 如果你 必须分贝手动修改数据会出现一些问题,序列化,因为这种格式存储值的大小已系列化和修改这个值,你必须计算和修改此PARAMS。
0

SQL(不论是mySQL还是任何其他变体)不支持数组数据类型。

你应该在SQL中处理这种数据的方式是将其存储在多个表中。因此,在这个例子中

,你必须包含buttonIDbuttonNamebuttonSuccess等领域的一个表,包含buttonInputTypebuttonInputValue领域的另一个表,以及buttonID链接回父表。

这将是推荐的“关系”处事方式。这样做的一点是,当时间到了时,它可以更容易地从数据库中查询数据。

虽然还有其他选项。

一个选项是使用mySQL的enum功能。既然你有一组固定的值可用于输入类型,你可以使用enum这个字段,这可以让你不必为此添加一个额外的表。

当然,另一种选择是其他人都提出的建议,并简单地使用json_encode()或类似的代码串行化数据,并将其全部存储在大文本字段中。

如果数据将被用作简单的数据块,而不需要运行查询来检查其中的部分,那么这有时可能是最简单的解决方案。这不是数据库专家想要看到的东西,但是从务实的角度来看,如果它做到了,那么可以随意使用它。

但是,了解这些限制很重要。通过使用序列化的解决方案,你基本上说“这些数据不需要以任何方式进行管理,所以我不能为它做适当的数据库设计而烦心。”没关系,只要您不需要管理它或在其中搜索值即可。如果你这样做,你需要更加努力地思考你的数据库设计,并小心采取'简单'选项。