2013-03-28 58 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()或類似的代碼串行化數據,並將其全部存儲在大文本字段中。

如果數據將被用作簡單的數據塊,而不需要運行查詢來檢查其中的部分,那麼這有時可能是最簡單的解決方案。這不是數據庫專家想要看到的東西,但是從務實的角度來看,如果它做到了,那麼可以隨意使用它。

但是,瞭解這些限制很重要。通過使用序列化的解決方案,你基本上說「這些數據不需要以任何方式進行管理,所以我不能爲它做適當的數據庫設計而煩心。」沒關係,只要您不需要管理它或在其中搜索值即可。如果你這樣做,你需要更加努力地思考你的數據庫設計,並小心採取'簡單'選項。