SimpleDB结果为PHP数组格式

时间:2013-03-21 16:48:25

标签: php multidimensional-array amazon-simpledb

我知道这个问题的变化之前已被问过并得到解答,但我是一个聪明的家伙,经过几周的搜索,我找不到我需要的东西。必须有一些简单的方法来做到这一点我不知道。

现有代码:

$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.
)

谢谢。

1 个答案:

答案 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)  

根据需要自定义。