У меня интересная проблема. Основой проблемы является то, что моя последняя итерация ссылки на массив не
кажется, "придерживаться", если хотите. Небольшой контекст: я разработал очень простую структуру данных для иерархии страниц, которая
выглядит так:
, 1,2,3> 4>, 5,6,7 <<, 8 </p>
Перевод: забудьте о надоедливых начальных запятых. Страницы 1, 2, 3 и 8 - это идентификаторы страниц верхнего уровня, 4 - это подстраница из 3 («>» означает углубление уровня), а 5, 6 и 7 - это подстраницы из 4.
Более читабельный формат будет выглядеть так:
1
2 * * +1010
3
- 4
- - 5
- - 6
- - 7
8
Не спрашивайте меня, почему я так делаю. Я еще не придумал более простой способ создания структуры с помощью javascript и публикации через веб-форму.
Проблема в том, что в рекурсивной функции все идет отлично, но я теряю страницу 8 в своей функции вызова. Я подозреваю, что ошибаюсь в некоторых элементах рекурсии, ссылок на переменные и области видимости переменных, и это превратилось в довольно загадку.
Ожидаемый результат (работает нормально в течение последнего вызова функции):
Array
(
[1] => Array
(
)
[2] => Array
(
)
[3] => Array
(
[4] => Array
(
[5] => Array
(
)
[6] => Array
(
)
[7] => Array
(
)
)
)
[8] => Array
(
)
)
Фактический выход (вне цикла):
Array
(
[1] => Array
(
)
[2] => Array
(
)
[3] => Array
(
[4] => Array
(
[5] => Array
(
)
[6] => Array
(
)
[7] => Array
(
)
)
)
)
Есть мысли?
[РЕДАКТИРОВАТЬ]: Я удалил пару остаточных я :: ссылки ...
КОД:
<?php
// recursive string in this format: (,\d+)*[>|<]?
// , = leading comma
// n,n+1 = comma-delimited list of page_ids
// > = indicates the next step in our depth-first approach
// < = indicates we're done with that set of children. back it up.
function parse_page_orders($page_orders, &$cur_page, &$trail)
{
// #1 matches our comma-led, comma-delimited list of page id's
// #2 matches our next step--forward or backward
preg_match('/([,\d+]*)([>|<])?/', $page_orders, $matches);
// remove this section of the page_orders variable so we can get on with our lives
$page_orders = str_replace($matches[0], '', $page_orders);
// #1: get the list of page ids and add it to the current page item
$p = explode(',', $matches[1]);
// start at 1 to skip the empty element at the beginning
for ($i=1; $i<count($p); $i++)
{
$cur_page[$p[$i]] = array();
}
// #2: determine our next step
if (isset($matches[2]))
{
if ($matches[2] == '>')
{
$trail[] = &$cur_page;
parse_page_orders($page_orders, $cur_page[end($p)], $trail);
}
elseif ($matches[2] == '<' && count($trail)>0)
{
parse_page_orders($page_orders, array_pop($trail), $trail);
}
}
else
{
// we're done. this should be our result.
print_r($cur_page);
}
}
$pages = array();
$trail = array();
$page_orders = ',1,2,3>,4>,5,6,7<<,8';
parse_page_orders($page_orders, $pages, $trail);
print_r($pages);
?>