我有一个数组$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:
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);
}
}
答案 1 :(得分: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]; }
}
}
希望这有助于你
答案 2 :(得分:0)
实际上,您可以在不检查密钥是否存在for:
的情况下执行此操作for($i = 0, $m = count($heap) - 1; $i < $m - 2; $i++) {
echo $heap[$i+1];
echo $heap[$i+2];
}
这将确保密钥仅发送到所有索引 - 2,因此在最后一次迭代中,$ i + 2将成为最后一个密钥。