Добрый день. У меня есть функция парсер, что берущий массив строки, как это:PHP рекурсивная функция уровня гнездования достигнута
['str','str2','str2','*str','*str2','**str2','str','str2','str2']
И recursivelly поднимает уровень тех, кто начинает с Астерикса, чтобы получить эту
['str','str2','str2',['str','str2',['str2']],'str','str2','str2']
И функция:
function recursive_array_parser($ARRAY) {
do {
$i = 0;
$s = null;
$e = null;
$err = false;
foreach ($ARRAY as $item) {
if (!is_array($item)) { //if element is not array
$item = trim($item);
if ($item[0] === '*' && $s == null && $e == null) { //we get it's start and end if it has asterix
$s = $i;
$e = $i;
} elseif ($item[0] === '*' && $e != null)
$e = $i;
elseif (!isset($ARRAY[$i + 1]) || $s != null && $e != null) { //if there are no elements or asterix element ended we elevate it
$e = $e == NULL ? $i : $e;
$head = array_slice($ARRAY, 0, $s);
$_x = [];
$inner = array_slice($ARRAY, $s, $e - $s + 1);
foreach ($inner as $_i)
$_x[] = substr($_i, 1);
$inner = [$_x];
$tail = array_slice($ARRAY, $e + 1, 999) or [];
$X = array_merge($head, $inner);
$ARRAY = array_merge($X, $tail);
$s = null;
$e = null;
$err = true;
}
} else {
$ARRAY[$i] = recursive_array_parser($ARRAY[$i]); //if the item is array of items we recur.
}
$i++;
if ($err == true) {
break 1;
}
}
} while ($err);
return $ARRAY;
}
Когда эта функция работает, я получаю «Неустранимая ошибка: максимальный уровень гнездования функции« 200 »достигнут, прерывая!» ошибка.
Я знаю, что это имеет какое-то отношение к бесконечной рекурсии, но я не могу отслеживать то место, где оно происходит, и это странно.
Если у вас есть '['* a', 'b', '* c']', то должно быть '['b', ['a', 'c']]' или '[ ['a'], 'b', ['c']] '? – kainaw
Я думаю, [[a], b, [c]], потому что астры показывают уровень. Я ошибаюсь? – splash58
@ splash58 Это похоже на то, что он пытается сделать, но если он хочет '['b', ['a', 'c']]', это было бы намного проще. Ошибка, очевидно, вызвана изменением $ ARRAY внутри foreach на основе $ ARRAY при одновременном увеличении $ i без учета $ ARRAY. – kainaw