2

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

{key : [TYPE,value]}

其中“类型”是 N,S...

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

{key : value}

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

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

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

4

1 回答 1

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

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

于 2013-06-08T15:51:19.680 回答