2017-07-10 13 views
1

を使用してDynamoDBのに連想配列をアップロード:私はPHPスクリプトを持っており、このスクリプトでは、私は連想配列は、次のようになります持っているので、私は配列のキーと値のペアを持っているPHP

$arr = array('First' => 'One', 'Second' => 'Two', 'Third' => 'Three'); 

私はAWS DynamoDBにテーブルがあり、テーブルにはdetailsという名前の属性があり、そのタイプはMapです。つまり、StringキーとString値がMapにあります。結局、質問の始まり。

ここで、連想配列をDynamoDBのテーブル、detailsマップタイプの属性にアップロードします。

DynamoDBのPHP SDKマニュアルの

、それは私が地図の鍵をアップロードする必要があると書かれており、手動でペアを値され、このような:

'M' => array(
    // Associative array of custom 'AttributeName' key names 
    'AttributeName' => array(
     // Associative array of custom key value pairs 
    ), 
    // ... repeated 
), 

しかし、問題はどのように多くの私にはわからないということですキーと値のペアを連想配列であるので、私は、キーと値の2つの配列にそれを分割することはできませんし、私が持っているペアの数でそれをアップロードする:

$keys[0] => array('S' => $values[0]), 
$keys[1] => array('S' => $values[1]), 
... 

私が考えた別のオプションは、にしましたループを作成し、DynamoDBテーブルの属性を更新するたびに、問題はマップタイプの属性なので、ADDまたはSETを使用してマップを更新することはできません。 DB上の既存のマップを取得して新しいペアを追加することもできません。なぜなら、マップ型の変数を使用しているからです。

私はキーと値の2つの配列に分割し、それらの配列をDBにアップロードする別のオプションを考えましたが、配列内の文字列の順序やキーとこれは、DynamoDBがアルファベット順に配列を配列するため、インデックス番号との一致がないためです。

連想配列をDynamoDBテーブルにアップロードするにはどうすればよいですか?

+0

あなたは何をする必要があるのか​​よく分かりません。2つの異なる配列でキーと値を分けるのですか? –

+0

いいえ。必要なのは、キーと値の順序を失うことなく、たとえばマップタイプとして、連想配列をDynamoDBにアップロードすることです。私が2つの異なる配列に分離することについて書いたのは、私が持っていたアイデアですが、なぜうまくいかないのかということも書きました。 –

+0

これは難しいですが、DynamoDBをご存知の方がいらっしゃいますか?(または、実際のコードのサンプルコードをシンプルにしてください) –

答えて

1

私があなたの質問を正しく理解していれば、あなたは基本的にあなたが必要とするものを持っていると思います。 AttributeNameは、定義した名前( 'details')のプレースホルダではなく、リテラル文字列として誤って解釈されたようです。 初めて初めて同じことをしました。

docs for PutItemによると、API呼び出しの 'Item'属性は次のようになります。あなたは、元の$編曲とその形式で新しい配列$ ARR2を作成する)(ループまたはarray_mapをを使用してを取る場合

'Item' => array(
    'details' => array(
     'M' => array(
      'First' => array('S' => 'One'), 
      'Second' => array('S' => 'Two'), 
      'Third' => array('S' => 'Three'), 
     ), 
    ), 
), etc. 

だから、あなたはそれを割り当てることができます。

のために適用される
'Item' => array(
    'details' => array('M' => $arr2), 
), 

同じUpdateItem

'ExpressionAttributeNames' => array(
    '#d' => 'details' 
), 
'ExpressionAttributeValues' => array(
    ':d' => array(
    'M' => array(
     'First' => array('S' => 'One'), 
     'Second' => array('S' => 'Two'), 
     'Third' => array('S' => 'Three') 
    ) 
) 
), 
'UpdateExpression' => 'SET #d = :d', 
+0

UpdateItemを使用する場合は、「UpdateExpression」を設定しながら、キーとマップ値を定義するには 'ExpressionAttributeNames'と 'ExpressionAttributeValues'を使用する必要があります。編集を参照してください。 – user18728

関連する問題