我知道这个问题的变化之前已被问过并得到解答,但我是一个聪明的家伙,经过几周的搜索,我找不到我需要的东西。必须有一些简单的方法来做到这一点我不知道。
现有代码:
$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
(
[tenants] => Array
(
[0] => Sam Smith
[1] => Janet Jones
[2] => Willy Wonka
)
[buildingName] => 123 Main St.
)
我需要考虑具有一个或多个值的[tenants]
。其他变量可能有也可能没有单个值。我还必须考虑[tenants]
可能不按顺序排列的可能性(即[buildingName]
为[2]
而另一[tenants]
位于[3]
。显然这里的概念我不明白。我该怎么做?
编辑私人数组评论
如果我将现有代码修改为以下内容:
$response = $sdb->get_attributes('domain','itemname');
$newresponse = $response->body->GetAttributesResult->to_array()->getArrayCopy();
print_r($newresponse);
我得到了这个结果:
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.
)
)
)
因此,虽然对“私人”的引用已经消失,但同样的基本问题也适用。
最终解决方案基于user2057272的回答
user2053727,你既是绅士(或女士)又是学者。你的答案几乎完美无缺。我遇到的一个问题是结果是:
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();
$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(convert sub-arrays with only one value to a string)与array_walk
部分。
我的结果现在正是我所需要的:
Array
(
[tenants] => Array
(
[0] => Sam Smith
[1] => Janet Jones
[2] => Willy Wonka
)
[buildingName] => 123 Main St.
)
谢谢。
答案 0 :(得分:0)
$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)
根据需要自定义。