2013-03-21 31 views
1

我知道這個問題的變種之前已經被問到和回答過,但我是一個聰明的人,經過幾個星期的搜索和搜索後,我找不到我需要的東西。必須有一些簡單的方法來做到這一點我缺少。SimpleDB結果到PHP數組格式

現有代碼:

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

我需要考慮有一個​​或更多值。其他變量可能有也可能沒有單個值。我還必須考慮可能性​​可能不按順序(即[buildingName][2]和另一​​在[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

這是一個私人數組 – csw 2013-03-21 16:58:13

+0

user2053727,我不知道這意味着什麼(並且Google沒有幫助)。但是我發現,如果我在'$ newresults'行的' - > to_array()'之後添加' - > getArrayCopy()',它會消除私有內容,並且數組中的第一個鍵變爲'[Attribute]'。所以我仍然有與上面描述的相同的問題。 – jjj916 2013-03-21 17:37:50

+0

你應該發佈[Attribute]輸出來清除 – csw 2013-03-21 17:41:49

回答

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) 

根據需要進行定製。

+0

這幾乎就是我所需要的。謝謝。我編輯了我原來的問題,發佈上面的最終解決方案。 – jjj916 2013-03-21 20:30:49