0

私は5レベルの多次元配列を持っています。配列内のキーの数は変動しますが、後で PHP でアクセスできるようにデータベースに格納する必要があります。これを行う簡単な方法はありますか?

#*私の考えは、いくつかの異なる区切り記号を使用して配列を単一の文字列%*に変換し、必要に応じて一連の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($*name1@*value1$*name2@*value2)       //else explode AGAIN by $* for a list of name value pairs which represent a drop box - name2@*value2

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

要約すると、多次元配列を 1 つのデータベース テーブルに格納する方法のアイデアを探しています。

4

4 に答える 4

4

必要なのは、データのシリアル化方法です。自分で発明しないでください。すでにたくさんあります。最も明白な候補は、JSON ( json_encode) または PHP 固有のserializeです。XML もオプションの 1 つです。特に、データベースが XML をある程度ネイティブにサポートしている場合はそうです。

于 2013-03-28T09:34:48.640 に答える
4

serializeまたはjson_encodeを見てください

于 2013-03-28T09:33:50.503 に答える
0

SQL (mySQL またはその他のバリアント) は、配列データ型をサポートしていません。

SQL でこの種のデータを処理する方法は、複数のテーブルにデータを格納することです。

したがって、この例ではbuttonIDbuttonNamebuttonSuccess、 などのフィールドを含む 1 つのテーブルと、buttonInputTypeおよびbuttonInputValueフィールドを含む別のテーブルがありbuttonID、親テーブルにリンクし直します。

それは、推奨される「リレーショナル」な方法です。このようにすることのポイントは、必要なときに DB からデータを簡単に照会できるようにすることです。

ただし、他のオプションがあります。

1 つのオプションは、mySQL のenum機能を使用することです。入力タイプに使用できる値の固定セットがあるため、そのenumためにフィールドを使用できます。これにより、そのための追加のテーブルを用意する必要がなくなります。

もちろん、別のオプションは、他の人が提案したものであり、単にデータをシリアライズするjson_encode()か、同様のものを使用して、すべてを大きなテキストフィールドに保存します。

データを単純なデータ ブロックとして使用し、クエリを実行してその一部を調べる必要がない場合、これが最も単純なソリューションになることがあります。これはデータベースの専門家が見たいと思うものではありませんが、実用的な観点から言えば、それが機能するのであれば、気軽に使用してください。

ただし、制限を認識することが重要です。シリアル化されたソリューションを使用することで、基本的には「このデータはまったく管理する必要がないため、適切なデータベース設計を行う必要はありません。」. それを管理したり、その中の値を検索したりする必要がない限り、それで問題ありません。もしそうなら、DB の設計についてもっとよく考える必要があり、「簡単な」オプションを慎重に選択する必要があります。

于 2013-03-28T12:31:55.720 に答える
0

あなたにとって最良の決定はjson_encodeです。

dbに格納するためのシリアル化以外に、json_encodeにはいくつかの利点があります。

  1. 小さいサイズを取る
  2. db でデータを手動で変更する必要がある場合、シリアル化に問題が発生します。この形式はシリアル化された値のサイズを格納し、この値を変更するには、このパラメーターを数えて変更する必要があるためです。
于 2013-03-28T10:12:15.793 に答える