Для выявления зацикленных цепочек в массиве, где элементы взаимосвязаны, можно использовать метод поиска в глубину (DFS, depth-first search). В PHP это можно реализовать с помощью рекурсивной функции. Мы будем отслеживать посещенные узлы и узлы, находящиеся на текущем пути, чтобы определить циклы.
Вот пример кода, который реализует данное решение:
```php
function findCycles($array) {
$visited = [];
$recStack = [];
$cycles = [];
foreach ($array as $node => $value) {
if (!isset($visited[$node])) {
$stack = [];
dfs($node, $array, $visited, $recStack, $stack, $cycles);
}
}
return $cycles;
}
function dfs($node, $array, &$visited, &$recStack, &$stack, &$cycles) {
$visited[$node] = true;
$recStack[$node] = true;
$stack[] = $node;
if (isset($array[$node])) {
$neighbour = $array[$node];
if (!isset($visited[$neighbour])) {
dfs($neighbour, $array, $visited, $recStack, $stack, $cycles);
} elseif ($recStack[$neighbour]) {
// Мы нашли цикл
$cycleStartIndex = array_search($neighbour, $stack);
if ($cycleStartIndex !== false) {
$cycles[] = array_slice($stack, $cycleStartIndex);
}
}
}
// Убираем узел из рекурсивного стека
array_pop($stack);
$recStack[$node] = false;
}
$array = [
385 => 392,
386 => 392,
387 => 392,
390 => 402,
402 => 421,
405 => 401,
409 => 416,
410 => 401,
414 => 402,
416 => 389,
420 => 421,
421 => 422,
422 => 420,
];
$cycles = findCycles($array);
print_r($cycles);
```
### Как работает данный код:
1. **Функция `findCycles`**: Инициализирует массивы для отслеживания посещенных узлов и узлов, находящихся на текущем пути, а затем для каждого узла запускает DFS, если он еще не был посещен.
2. **Функция `dfs`**: Выполняет рекурсивный обход графа:
- Отмечает узел как посещенный и добавляет его в стек текущего пути.
- Если существует соседний узел, который не был посещен, рекурсивно вызывает `dfs` для него.
- Если находит узел, который уже находится в текущем пути (`recStack`), это означает, что найден цикл. В этом случае сохраняет все узлы цикла.
- Удаляет узел из стека текущего пути, отмечая его как неактивный для дальнейшей рекурсии.
### Замечания:
- Этот подход сможет выявить все зацикленные цепочки, включая их длину и содержание.
- Учтите, что данная реализация может находить один и тот же цикл несколько раз, если цикл пересекается с другими путями, поэтому при необходимости можно доработать логику для устранения повторяющихся циклов.