所有从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结果