$array = [
385 => 386,
386 => 385, // миницикл на 2
387 => 385,
390 => 402,
402 => 421,
405 => 401,
409 => 409, // микроцикл
410 => 401,
414 => 402,
416 => 389,
420 => 421,
421 => 422,
422 => 420,
423 => 424,
424 => 425,
425 => 426,
426 => 427,
427 => 420,
];
//*/
/**
* Расставляет ветки по уровням
*/
$leaf = []; // уровни веток в нашем "дереве";
$loop = []; // циклы в дереве
$minlev = 1; // минимальный и максимальный уровень
$maxlev = 0;
foreach ($array as $key => $value) {
$v = $value;
if (!isset($leaf[$key])) {// совсем нехоженая ветка?
$minlev -= count($array); // чтобы гарантированно не пересекаться уровнями
$leaf[$key] = $minlev;
}
$level = $minlev;
while (true) {
if (!isset($array[$v])) // ссылка вовне дерева, дальше не идем
break;
if (!isset($leaf[$v])) { // первый раз?
$leaf[$v] = ++$maxlev;
$level = $maxlev;
} else if ($leaf[$v] > $level) {
$level = $leaf[$v]; ; // продолжаем? А зачем ?
break;
} else { // loop found
// уже включен этот цикл ?
$t = $v;
do {
if (isset($loop[$t])) break 2;
if (!isset($array[$t])) break 2; // это не цикл
$t = $array[$t];
} while ($t != $v);
$loop[$v] = 0;// пометили
break;
}
$v = $array[$v];
}
}
if (!empty($loop)) {
printf("loops found:");
foreach ($loop as $k => $v) {
echo "\n:";
$t = $k;
do {
printf("%s=>%s,", $t, $array[$t]);
$t = $array[$t];
} while (isset($array[$t]) && $t != $k);
}
} else {
printf("no loops found\n");
}
.button1 {
position: absolute;
top:calc(100% * (200 + 10)/300);
left:calc(100% * (240 + 12)/450);
transform: translate(-50%, -50%);
}
... {
position: absolute;
top:calc(100% * 200/300);
left:calc(100% *240/450);
},
$(document).on('click','#login',function (event) {
тогда не нужно ставить обработчики рекурсивно и выкинуть уродливый bindFormSubmit