У меня есть массив $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];
}
}
Что я делаю не так и как я могу это решить?
Я думаю, что ошибка в вашем чеке:
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);
}
}
Это просто уведомление, чтобы остановить его, просто определите смещение, просто проверив, существует ли ключ массива. Используйте код ниже
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]; }
}
}
Надеюсь, это поможет вам
На самом деле вы можете сделать это, не проверяя, существует ли ключ с for:
for($i = 0, $m = count($heap) - 1; $i < $m - 2; $i++) {
echo $heap[$i+1];
echo $heap[$i+2];
}
Это будет гарантировать, что ключ идет только на все индексы — 2, поэтому в последней итерации $ i + 2 будет последним ключом.