2013-10-20 82 views
0

我有這樣一個數組:數組操作(PHP)

Array 
{ 
    'property1.subproberty11' => "xxxxx", 
    'property1.subproberty12' => "yyyy", 
    'property2.subproberty21.subproperty211' => "zzzzzz", 
    'property2.subproberty21.subproperty212' => "wwwww", 
    'property2.subproberty22' => "yyyy", 
    .... 

需要被改變成類似:

Array 
(
[property1] => Array 
    (
      ['subproberty11'] => "xxxxx" 
      ['subproberty12'] => "yyyy" 
    ) 

[property2] => Array 
    (
     [subproperty21] => Array 
      (
       [subproperty211] => "zzzzzz" 
       [subproperty212] => "wwwwww" 
      ) 
     ['subproberty22'] => "yyyy" 

    ) 
    ... 

我找不到這樣的一個聰明的辦法, 有人能幫我嗎 ?

所以,到目前爲止,我還以爲這種算法的:

$new_array = array(); 
foreach($old_array as $key => $value) 
{ 
    $subkeys = explode('.', $key); 
    $ss = array(); 
    for($ii = 0 ; $ii < count($subkeys) ; $ii++) 
    { 
     $ss[] = "['".$subkeys[$ii]."']"; 
     if ($ii < count($subkeys) -1) 
      eval('$new_array'.implode('',$ss).' = array();'); 
    } 
    eval('$new_array'.implode('',$ss)." = '".$value."';'); 
} 

我認爲我們可以做的更好,例如也許我們可以通過避免創建新陣列的數據複製?

+0

你會如何描述一個 「聰明」 的方式?你已經嘗試過什麼,它在哪裏失敗了? – kero

回答

0

我的工作例如:

function nestedKeysArray($input) { 
    $array = array(); 
    foreach ($input as $key => $value) { 
     $keys = explode('.', $key); 
     if (count($keys) == 1) { 
      $array[$key] = $value; 
     } else { 
      $nested = &$array; 
      foreach ($keys as $k) { 
       if (!isset($nested[$k])) 
        $nested[$k] = array(); 
       $nested = &$nested[$k]; 
      } 
      $nested = $value; 
     } 
    } 
    return $array; 
} 

$輸入數組像的問題第一個。

編輯: 改變原有的陣列,無副本:

function nestedKeysArray(&$input) { 
    foreach ($input as $key => $value) { 
     $keys = explode('.', $key); 
     if (count($keys) > 1) { 
      $nested = &$input; 
      foreach ($keys as $k) { 
       if (!isset($nested[$k])) 
        $nested[$k] = array(); 
       $nested = &$nested[$k]; 
      } 
      $nested = $value; 
      unset($input[$key]); 
     } 
    } 
} 
+0

它不與該陣列的工作: 陣列( 'property1.subproberty11'=> 「XXXXX」, 'property1.subproberty12'=> 「YYYY」, 'property2.subproberty21.subproperty211'=> 「ZZZZZZ」, 'property2.subproberty21.subproperty212'=> 「WWWWW」, 'property2.subproberty22'=> 「YYYY」, 'property3'=> 「XXX」 \t \t \t \t ); – MaD

+0

已經爲此改進) – Arantir

+0

但無論如何嵌套必須是正確的。它不會處理像Array('property1'=>「xxxxx」,'property1.subproberty12'=>「yyyy」)的錯誤觀念; – Arantir

0

一些未經測試的代碼,給你你可以採取的方向。

只是遍歷數組;

function SplitArray($properties) { 
    foreach($properties as $item=>$property) { 
     $properties[$item] = explode('.',$property, 2); 
     if(strpos($properties[$item][1], '.') === false)) {} 
     else { 
      $properties[$item][1] = SplitArray($properties[$item][1]); 
     } 
    } 
    return $properties; 
}