SimpleDB结果转换为PHP数组格式
我知道这个问题以前有人问过,也有人回答过,但我是个聪明人,在断断续续地搜寻了几个星期后,我找不到我需要的东西。一定有什么简单的方法可以做到这一点,我错过了 现行守则:SimpleDB结果转换为PHP数组格式,php,multidimensional-array,amazon-simpledb,Php,Multidimensional Array,Amazon Simpledb,我知道这个问题以前有人问过,也有人回答过,但我是个聪明人,在断断续续地搜寻了几个星期后,我找不到我需要的东西。一定有什么简单的方法可以做到这一点,我错过了 现行守则: $response = $sdb->get_attributes('domain','itemname'); $newresponse = $response->body->GetAttributesResult->to_array(); print_r($newresponse); 我得到这个结果: C
$response = $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array();
print_r($newresponse);
我得到这个结果:
CFArray Object
(
[storage:ArrayObject:private] => Array
(
[Attribute] => Array
(
[0] => Array
(
[Name] => tenants
[Value] => Sam Smith
)
[1] => Array
(
[Name] => tenants
[Value] => Janet Jones
)
[2] => Array
(
[Name] => tenants
[Value] => Willy Wonka
)
[3] => Array
(
[Name] => buildingName
[Value] => 123 Main St.
)
)
)
)
Array
(
[Attribute] => Array
(
[0] => Array
(
[Name] => tenants
[Value] => Sam Smith
)
[1] => Array
(
[Name] => tenants
[Value] => Janet Jones
)
[2] => Array
(
[Name] => tenants
[Value] => Willy Wonka
)
[3] => Array
(
[Name] => companyname
[Value] => 123 Main St.
)
)
)
我希望这些数据是什么样子的:
Array
(
[tenants] => Array
(
[0] => Sam Smith
[1] => Janet Jones
[2] => Willy Wonka
)
[buildingName] => 123 Main St.
)
我需要说明具有一个或多个值的[租户]。其他变量可能有一个值,也可能没有一个值。我还必须说明,[租户]可能不是按顺序排列的,即[buildingName]是[2],而另一个[租户]是[3]。这里有一个我不明白的概念。我该怎么做
编辑以解决专用数组注释
如果我将现有代码修改为以下内容:
$response = $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array()->getArrayCopy();
print_r($newresponse);
$response= $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array();
$new = array();
foreach($newresponse["Attribute"] as $key => $value)
{
if(!isset($new[$value['Name']]))
{
$new[$value['Name']] = array();
}
$new[$value['Name']][] = $value['Value'];
}
array_walk($new, $walker = function (&$value, $key) use (&$walker)
{
if (is_array($value))
{
if (count($value) === 1 && is_string($value[0]))
{
$value = $value[0];
}
else
{
array_walk($value, $walker);
}
}
}
);
print_r($new);
我得到这个结果:
CFArray Object
(
[storage:ArrayObject:private] => Array
(
[Attribute] => Array
(
[0] => Array
(
[Name] => tenants
[Value] => Sam Smith
)
[1] => Array
(
[Name] => tenants
[Value] => Janet Jones
)
[2] => Array
(
[Name] => tenants
[Value] => Willy Wonka
)
[3] => Array
(
[Name] => buildingName
[Value] => 123 Main St.
)
)
)
)
Array
(
[Attribute] => Array
(
[0] => Array
(
[Name] => tenants
[Value] => Sam Smith
)
[1] => Array
(
[Name] => tenants
[Value] => Janet Jones
)
[2] => Array
(
[Name] => tenants
[Value] => Willy Wonka
)
[3] => Array
(
[Name] => companyname
[Value] => 123 Main St.
)
)
)
因此,虽然“私人”的提法已经消失,但同样的基本问题也适用
基于用户205722答案的最终解决方案
用户2053727,您既是绅士或淑女,又是学者。你的回答几乎完美无瑕。我遇到的一个问题是,结果是:
Array
(
[tenants] => Array
(
[0] => Sam Smith
[1] => Janet Jones
[2] => Willy Wonka
)
[buildingName] => Array
(
[0] => 123 Main St.
)
)
为了将[buildingName]修复为字符串而不是数组,因为只有一个元素,我将最终代码修改为:
$response = $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array()->getArrayCopy();
print_r($newresponse);
$response= $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array();
$new = array();
foreach($newresponse["Attribute"] as $key => $value)
{
if(!isset($new[$value['Name']]))
{
$new[$value['Name']] = array();
}
$new[$value['Name']][] = $value['Value'];
}
array_walk($new, $walker = function (&$value, $key) use (&$walker)
{
if (is_array($value))
{
if (count($value) === 1 && is_string($value[0]))
{
$value = $value[0];
}
else
{
array_walk($value, $walker);
}
}
}
);
print_r($new);
我感谢janmoesen的array_walk部分
我的结果现在正是我所需要的:
Array
(
[tenants] => Array
(
[0] => Sam Smith
[1] => Janet Jones
[2] => Willy Wonka
)
[buildingName] => 123 Main St.
)
多谢各位
$new = array();
foreach($newresponse["Attribute"] as $key => $value) {
if(!isset($new[$value['Name']])) {
$new[$value['Name']] = array();
}
$new[$value['Name']][] = $value['Value'];
}
var_dump($new)
根据需要定制。用户2053727,我不知道这意味着什么,谷歌也帮不上忙。但是我发现,如果我在$newresults行的->to_数组之后添加->getArrayCopy,它将消除私有内容,数组中的第一个键将成为[Attribute]。因此,我仍然存在如上所述的相同问题。您应该发布[Attribute]输出,以使其明确这几乎正是我所需要的。非常感谢。我编辑了我的原始问题,将我的最终答案发布在上面。