从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;
}
是否有一种我忽略的方法可以使这更容易,而不必遍历每个键?
答案 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());
}