使用SDK2 for PHP从DynamoDB中获取值的更简单方法?

时间:2013-06-06 19:44:56

标签: php amazon-web-services amazon-dynamodb

从DynamoDB返回结果的所有方法和迭代器似乎都包含以下格式(以json样式):

{key : [TYPE,value]}

'TYPE'是N,S ......

我希望它们采用以下格式:

{key : value}

其中'value'是一个字符串,如果是S,一个数字,如果是N(或者这样的数组,如果是set形式)。

API包含一个帮助器方法,用于按类型从数组格式化属性: http://docs.aws.amazon.com/aws-sdk-php-2/latest/class-Aws.DynamoDb.DynamoDbClient.html#_formatAttributes

是否存在一个预先存在的辅助方法或标志,它会对我忽略的结果做出相反的反应?

我知道这的实现有点微不足道 - 每次我使用结果时进行转换似乎都有点工作。 (这是一个只提供'N'和'S'案例的天真版本)

$iterator = $client->getIterator('Scan',$params);
foreach($iterator as $item){
    $newitem = [];
    foreach($item as $k => $v){
        foreach($v as $type => $actualv){
            switch($type){
                case 'S' :
                    $newitem[$k] = $actualv;
                    break;
                case 'N' :
                    $newitem[$k] = (int)$actualv;
                    break;
            }
        }
    }
    echo json_encode($newitem).PHP_EOL;
}

是否有一种我忽略的方法可以使这更容易,而不必遍历每个键?

1 个答案:

答案 0 :(得分:2)

[编辑:在SDK的2.4.1版之前],没有一个真正的预先存在的帮助器,但由于你使用getIterator,你可以使用一些迭代器魔术。尝试这样的事情(建立原始代码):

$iterator = $client->getIterator('Scan', $params);
$iterator = new \Guzzle\Iterator\MapIterator($iterator, function ($item) {
    return array_map('current', $item);
});

foreach ($iterator as $item) {
    // Get a single attribute value
    echo $item['attribute_name'] . "\n";

    // Print the item attributes
    echo print_r($item);
}

编辑:对于版本2.4.1+,您可以使用包含的ItemIterator类,它类似于我对MapIterator所做的操作。

$iterator = $client->getIterator('Scan', $params);
$iterator = new \Aws\DynamoDb\Iterator\ItemIterator($iterator);

foreach ($iterator as $item) {
    // Get a single attribute value
    echo $item['attribute_name'] . "\n";

    // Print the item attributes
    echo print_r($item->toArray());
}

编辑:另见Iterating through Amazon DynamoDB Results