2012-06-28 62 views
1

如何返回PHP中樹形格式的多維數組鍵?如何在PHP中以樹形格式返回多維數組鍵?

舉例來說,如果我有以下陣列:

$array = array ( 
    array (
     'name' => 'A', 
     'product' => array (
      'qty' => 1, 
      'brand' => 'Tim' 
     ), 
     'goods' => array (
      'qty' => 2 
     ), 
     'brand' => 'Lin' 
    ), 
    array (
     'name' => 'B', 
     'product' => array (
      'qty' => 6, 
      'brand' => 'Coff' 
     ), 
     'goods' => array (
      'qty' => 4 
     ), 
     'brand' => 'Ji' 
    ) 
); 

我怎樣才能得到這樣的結果如下 - 包括沒有重複鍵:

-name 
-product 
--qty 
--brand 
-goods 
--qty 
--brand 
+0

上,你只需要按鍵印刷,保持沒有價值? –

回答

0

與無限深度您需要一個遞歸函數。我想你有父母姓名和孩子在$子女:

function render_select($root=0, $level=-1) 
{ 
    global $names, $children; 
    if ($root != 0) 
     echo '<option>' . strrep(' ', $level) . $names[$root] . '</option>'; 
    foreach ($children[$root] as $child) 
     render_select($child, $level+1); 
} 

這個函數使用有用,因爲你可以用2個變量餵它。另一個答案需要一個多維數組。

+0

函數中的全局變量是糟糕的設計和糟糕的做法。它們依賴於全局範圍內變量的名稱,並使您的功能不可移植。 'global'和'$ GLOBALS'很像'goto' - 只是因爲它們在那裏,並不意味着你應該永遠使用它們。這個規則很少有例外,但這不是其中之一。 – DaveRandom

+0

Typo3使用了很多全局變量。你能說常量比全局變量更好嗎? – Bytemain

+1

功能性編程語言和麪向對象編程語言「固定」的大多數問題都與封裝數據有關,並且具有「數據來自何處」,「最後修改位置」,「如何修改」的清晰路徑。程序代碼的不足之處在於,通過使用'global'和'goto',您可以在預期他們保持其狀態時意外獲得更改全局變量的結果。因此,應用程序的行爲發生了變化。 –

1

遞歸函數應包括任何深度你想/需要:

function print_tree($tree, $level = 0) { 
    foreach($tree AS $name => $node) { 
     if(
       is_scalar($node) OR 
       (
        is_object($node) AND 
        method_exists($node, '__toString') 
       ) 
      ) { 
      echo str_repeat('-', $level).$name.': '.$node; 
     } 
     else if(
        is_array($node) OR 
        (
         is_object($node) AND 
         $node InstanceOf Traversable 
        ) 
       ) { 
      echo str_repeat('-', $level).$name.":\n"; 
      print_tree($node, $level+1); 
     } 
    } 
} 
+0

看起來像你打敗了我。但是,也許你會打印一個字符串 - 非標量值的表示。 –

+0

我添加了對字符串對象和陣列對象的額外檢查 –

+0

打印類似[類X的對象]對於沒有__toString方法的對象會很有用。和資源。迭代器可以遍歷遍歷,所以不需要包含它。 –

0
function print_tree($array, $level=1) { 
    foreach($array as $element) { 
     if(is_array($element)) { 
      print_tree($element, $level+1); 
     } else { 
      print str_repeat('-', $level).$element."\n"; 
     } 
    } 
} 
+0

你應該首先檢查'is_scalar'的值,因爲它更可能是一個標量,並且需要更少的時間來檢查它是標量還是測試它是否是數組/對象。 –

+1

IMO,打印非數組和非標量值的字符串表示比完全省略它們更可取。 –

+0

這是真的,但您無法打印沒有__toString方法的對象嗎?所以你應該檢查確認。 –