У меня есть таблица в базе данных, которая содержит различные пути к страницам моего веб-сайта. Каждый путь указан только один раз. В настоящее время у меня есть очень длинная и запутанная серия запросов и PHP, чтобы извлечь все это и переписать данные в неупорядоченный список (чтобы создать меню для моего веб-сайта). Кажется, что, вероятно, существует относительно простой подход к циклу, который работал бы НАМНОГО эффективнее, но я не могу ничего добиться. Я нашел ТОННУ PHP-скриптов, которые создают списки UL из файловых деревьев, но все они либо не работают. t работают или не могут справиться с изначально нерекурсивным характером результатов моего запроса (для некоторых требуются многомерные массивы моих путей, что было бы хорошо, за исключением моей проблемы с их созданием). Я нашел сценарий, который работает довольно близко, но он неправильно форматирует часть
, помещая подсписки вне раздела
(я объясню ниже)
Вот пример:
DB возвращает следующее в массиве результатов:
about/contact/
about/contact/form/
about/history/
about/staff/
about/staff/bobjones/
about/staff/sallymae/
products/
products/gifts/
products/widgets/
, и я хочу создать следующий результат:
- about/
- about/contact/
- about/contact/form/
- about/history/
- about/staff/
- about/staff/bobjones/
- about/staff/sallymae/
- products/
- products/gifts/
- products/widgets/
Итак, я очень близко подошел к найденному здесь сценарию: http: / /www.daniweb.com/forums/thread285916.html, но я столкнулся с проблемой. Оказывается, найденный мной скрипт создает неправильно отформатированные списки UL. В ПРАВИЛЬНОЙ ситуации подсписок содержится в
родительского элемента. В этом сценарии родительский
закрывается, а затем вставляется блок
. Общий сценарий на самом деле довольно элегантен в том смысле, что он не отстает от уровней и тому подобного, но я не могу осмыслить его достаточно, чтобы понять, как это исправить. У меня все это в функции:
function generateMainMenu()
{
global $db;
$MenuListOutput = '';
$PathsArray = array();
$sql = "SELECT PageUrlName FROM `table`";
$result = mysql_query($sql, $db) or die('MySQL error: ' . mysql_error());
while ($PageDataArray = mysql_fetch_array($result))
{
$PathsArray[] = rtrim($PageDataArray['PageUrlName'],"/"); //this function does not like paths to end in a slash, so remove trailing slash before saving to array
}
sort($PathsArray);// These need to be sorted.
$MenuListOutput .= ''.$limb[$i]." \n";// Print the Leaf link
$topmark=$i;// Establish the number of directories in this path
}else{
// It's a directory
if($directories[$i]!=$limb[$i]){
// If the directory is the same as the previous path we are not interested.
if ($topmark>$i){// the previous path had more directories, therefore more Unordered Lists.
$MenuListOutput .= str_repeat("",$topmark-$i);// Close off the Unordered Lists
$MenuListOutput .= "\n";// For neatness
}
// (next line replaced to avoid duplicate listing of each parent)
//$MenuListOutput .= "".$limb[$i]." \n\n";
$MenuListOutput .= "\n";
$submenu++;// Increment the dropdown.
$directories[$i]=$limb[$i];// Mark it so that if the next path's directory in a similar position is the same, it won't be processed.
}
}
}
}
$MenuListOutput .= str_repeat("
",$topmark+1);// Close off the Unordered Lists
return $MenuListOutput."\n\n\n";
}
",$topmark-$i); // Close off the Unordered Lists
$MenuListOutput .= "\n";// For neatness
}
$MenuListOutput .= '
, и она возвращает что-то вроде этого:
Кто-нибудь знает, где мне нужно добавить дополнительную логику и как я могу этого добиться? Есть другие идеи, как это сделать лучше? Похоже, что это настолько распространенная проблема, что существует простой / стандартный метод решения чего-то вроде этого. Может быть, если бы я мог понять, как создать многомерный массив из моих путей, то их можно было бы повторить, чтобы эта работа работала?
РЕДАКТИРОВАТЬ: Более сложный: Чтобы отобразить «имя» страницы, мне также нужно иметь эту информацию в массиве, поэтому путь, вероятно, лучше работает как ключ массива и имя в значении. Любые мысли об изменении, как это:
$paths = array(
"about/contact/ " => "Contact Us",
"about/contact/form/ " => "Contact Form",
"about/history/ " => "Our History",
"about/staff/ " => "Our Staff",
"about/staff/bobjones/ " => "Bob",
"about/staff/sallymae/ " => "Sally",
"products/ " => "All Products",
"products/gifts/ " => "Gift Ideas!",
"products/widgets/ " => "Widgets"
);
, а затем использовать что-то вроде этой строки в функции buildUL
:
echo ''.$paths[$prefix.$key].'';