Малко помощ за PHP и array_splice


1

Блъскам си главата с едно нещо. Php код, array_splice функцийка. Задачката е проста - да вмъкнем елемент в сортиран масив на мястото му. Не мога да разбера защо като използвам array_splice във for цикъла стига до безкраен цикъл, а извън цикъла работи както трябва.

http://sandbox.onlinephpfunctions.com/

$array = [1,3,5,7,8,11,45];
$n = 6;
for ($i = 1; $i < count($array); $i++) {
if(($array[$i - 1] <= $n) && ($n < $array[$i])) {
array_splice( $array, $i, 0, $n );
}
}
//array_splice( $array, 3, 0, [6] );
print_r($array);




Отговори



1

Получава се безкраен цикъл, защото след всяка итерация влизаш в условието и добавяш нов елемент към съществуващия масив.

За първи път влизаш когато $i = 3 (защото 5 <= 6 && 6 < 7), при което добавяш нов елемент в масива. При следващата итерация когато $i = 4, масивът ти изглежда така [1, 3, 5, 6, 7, 8, 11, 45], защото при предишната итерация си добавил шестицата. Проверката когато $i = 4 изглежда така - (6 <= 6 && 6 < 7), при което отново добавяш нов елемент [1, 3, 5, 6, 6, 7, 8, 11, 45]. При следващата итерация, размерът на масива ще се е увеличил отново и когото $i = 5 проверката отново ще изглежда така (6 <= 6 && 6 < 7). Мисля, че вече се досети откъде идва безкрайният цикъл :)

Простото решение е да сложиш break след array_splice в условието.

За да не се получават такива недоразумения следващия път, ти препоръчвам да си инсталираш Xdebug. Просто копираш изхода от phpinfo() и то ще ти каже коя версия да свалиш и как да го инсталираш.


от PaperNick (494 точки)


1

Да, заради по-голямо или равно. Същото нещо става и когато използвам 3 вместо i и за това толкова се обърках. А и дължината на масива се увеличава всеки път. Ще го кача хдебъг. Мерси! :) Все пак готин начин да влезнеш в безкраен цикъл. ;д



1
Да, не бях виждал подобно влизане в безкраен цикъл :D

от PaperNick (494 точки)