(1)广度优先
说明:
代码:
1 <?php 2 3 $arr = [ 4 'A' => [ 5 'B' => [ 6 'D' => ['H', 'I'], 7 'E' => ['J'], 8 'F', 9 ], 10 'C' => ['G'], 11 ], 12 ]; 13 14 //直接用数组遍历 15 //print_R(bfsArr($arr)); 16 17 18 //先将数组转成树, 再遍历 19 //$tree = current(buildTree($arr)); 20 //$queue = [$tree->val]; 21 //print_r(bfsObj([$tree])); 22 23 24 function bfsArr($queue) { 25 static $res; 26 $val = key($queue); 27 $out = array_shift($queue); 28 if (is_array($out)) { 29 $res[] = $val; 30 $queue = array_merge($queue, $out); 31 } else { 32 $res[] = $out; 33 } 34 35 if (!empty($queue)) { 36 bfsArr($queue); 37 } 38 return $res; 39 } 40 41 function bfsObj($queue) { 42 static $res; 43 $out = array_shift($queue); 44 $res[] = $out->val; 45 $queue = array_merge($queue, $out->nodes); 46 47 if (!empty($queue)) { 48 bfsObj($queue); 49 } 50 return $res; 51 } 52 53 54 function buildTree($arr) { 55 $ret = array(); 56 if (is_array($arr)) { 57 foreach ($arr as $k => $v) { 58 if (is_numeric($k)) { 59 $tree = nodeFactory($v); 60 } else { 61 $tree = nodeFactory($k); 62 $tree->nodes = buildTree($v); 63 } 64 $ret[] = $tree; 65 } 66 } else { 67 return nodeFactory($arr); 68 } 69 return $ret; 70 } 71 72 73 function nodeFactory($val) { 74 $node = new stdClass(); 75 $node->val = $val; 76 $node->nodes = array(); 77 return $node; 78 }