2015-01-13 35 views
1

我有一个数组$heap = array(9, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, 9, 8, 8, 9, 7, 9, 8, 8, 9, 9,);,我想输出它就像二叉树,当两个子节点我们可以知道这个公式,$heap[$key*2+1]和第二个$heap[$key*2+2]。我尝试使用的foreach,但得到的错误有关未定义运行偏移21.这是的foreach:输出堆为树PHP

foreach ($heap as $key => $value) { 
    echo $value; 
    if ($key != count($heap)) { 
     echo $heap[$key*2+1]; 
     echo $heap[$key*2+2]; 
    } 
} 

什么我做错了,我该如何解决这个问题?

+0

请注意不是错误 –

回答

1

我想在您的支票错误:

if ($key != count($heap)) { 
    echo $heap[$key*2+1]; 
    echo $heap[$key*2+2]; 
} 

这里可能是一个$key*2+2情况是出数组的边界。也为它添加检查。尝试使用 bool array_key_exists (mixed $key , array $array),这样的事情:

if ($key != count($heap)) { 
    if (array_key_exists($key*2 + 1, $heap)) echo $heap[$key*2 + 1]; 
    if (array_key_exists($key*2 + 2, $heap)) echo $heap[$key*2 + 2]; 
} 

正如你在评论指出,你在你的代码加倍值。这可以通过递归函数,是这样的(伪)来避免:

printArray(i, aHeap) { 
    if (i < count($heap)) { 
     echo $heap[i]; 
     printArray(2*i + 1, aHeap); 
     printArray(2*i + 2, aHeap); 
    } 
} 
+0

现在不行不行。奇怪为什么这不起作用。它检查堆中的元素何时会散失 – nowiko

+0

@Panzer_Commander增加了对PHP函数的一些引用 – VMAtm

+0

我想单次输出每个节点,但现在我得到每个节点重复两次,孩子节点,第二个孩子节点。 – nowiko

1

它只是一个通知来阻止它仅仅定义了刚刚检查,如果数组键存在偏移。使用下面

foreach ($heap as $key => $value) { 
    echo $value; 
    if ($key != count($heap)) { 
     if (array_key_exists($key*2 + 1, $heap)){ echo $heap[$key*2 + 1];} 
    if (array_key_exists($key*2 + 2, $heap)){ echo $heap[$key*2 + 2]; } 
    } 
} 

希望这段代码可以帮助您

0

其实如果密钥与用于存在,你可以这样做,不检查:

for($i = 0, $m = count($heap) - 1; $i < $m - 2; $i++) { 
    echo $heap[$i+1]; 
    echo $heap[$i+2]; 
} 

这将确保关键只到所有索引 - 2,所以在最后一次迭代中,$ i + 2将是最后一个键。