2

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
4

3 に答える 3

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);
         }
     }
 }
于 2012-06-28T11:12:06.070 に答える
0

深さが無制限の場合、再帰関数が必要です。$ namesに親があり、$childrenに子があると思います。

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つの変数を使用できるため、便利です。他の回答者は多次元配列を必要とします。

于 2012-06-28T11:11:41.907 に答える
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";
        }
    }
}
于 2012-06-28T11:12:23.083 に答える