Хорошо, мне удалось собрать воедино фрагмент кода, который, кажется, работает.
Сначала я вручную объединяю столбцы в строки / column1 / column2 / column3 / column4 / column5 в одномерном массиве;Затем, применяя функции из данного URL, рассмотрим этот простой массив в дерево массивов.Наконец, я использую функцию makeULLI для генерации неупорядоченного списка со ссылками для каждого присутствующего узла.Я расширил код, добавив пользовательские пути к URL-адресам в зависимости от глубины ссылки, для использования в SEO-дружественных ссылках, но я лишился этого.
Я прилагаю код, который делает все это и удивительномаленький.Код должен работать на любом количестве уровней, я запустил его в таблице, содержащей около 400 строк (5 столбцов), и он выполняется за 0,0168 секунды.Если кто-нибудь увидит дальнейшую оптимизацию кода, я был бы благодарен.
foreach ($geoArray as $result)
{
$mynewGEO[] = $result['parent'];
$mynewGEO[] = $result['parent'].'/'.$result['child'];
$mynewGEO[] = $result['parent'].'/'.$result['child'].'/'.$result['grandchild'];
$mynewGEO[] = $result['parent'].'/'.$result['child'].'/'.$result['grandchild'].'/'.$result['grand-grandchild'];
$mynewGEO[] = $result['parent'].'/'.$result['child'].'/'.$result['grandchild'].'/'.$result['grand-grandchild'].'/'.$result['grand-grand-grandchild'];
}
$key_files = array_combine(array_values($mynewGEO), array_values($mynewGEO));
$tree = explodeTree($key_files, "/", true);
echo makeULLI($tree);
function makeULLI($array) {
$return = "<ul>\n";
if (is_array($array) && count($array) > 0) {
foreach ($array as $k => $v) {
if($k == "__base_val") continue;
// determine the __base_val value in orde to use for the link.
$our_linky = ( is_array($v) ? $v["__base_val"] : $v );
if (is_array($v) && count($v) > 0) {
$return .= "\t<li><a href=\"".$our_linky."/\" >" . $k ."</a>". makeULLI($v) . "</li>\n";
}
else {
$return .= "\t<li><a href=\"".$our_linky."/\" >" . $k . "</a></li>\n";
//to return full path
//$return .= "\t<li><a href=\" # \" >" . $v . "</a></li>\n";
}
}
} else {}
$return .= "</ul>";
return $return;
}
function explodeTree($array, $delimiter = '_', $baseval = false)
{
if(!is_array($array)) return false;
$splitRE = '/' . preg_quote($delimiter, '/') . '/';
$returnArr = array();
foreach ($array as $key => $val) {
// Get parent parts and the current leaf
$parts = preg_split($splitRE, $key, -1, PREG_SPLIT_NO_EMPTY);
$leafPart = array_pop($parts);
// Build parent structure
// Might be slow for really deep and large structures
$parentArr = &$returnArr;
foreach ($parts as $part) {
if (!isset($parentArr[$part])) {
$parentArr[$part] = array();
} elseif (!is_array($parentArr[$part])) {
if ($baseval) {
$parentArr[$part] = array('__base_val' => $parentArr[$part]);
} else {
$parentArr[$part] = array();
}
}
$parentArr = &$parentArr[$part];
}
// Add the final part to the structure
if (empty($parentArr[$leafPart])) {
$parentArr[$leafPart] = $val;
} elseif ($baseval && is_array($parentArr[$leafPart])) {
$parentArr[$leafPart]['__base_val'] = $val;
}
}
return $returnArr;
}