使用PHP的SDK2从DynamoDB返回值的更简单方法


Easier way to get back values from DynamoDB using SDK2 for PHP?

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

{key : [TYPE,value]}

其中'TYPE'为N,S…

我希望它们的格式为:

{key : value}

如果'value'为S,则为String;如果为N,则为number(或集合形式的此类数组)。

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;
}

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

[编辑:在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());
}

编辑:另请参见迭代Amazon DynamoDB结果