Преобразовать массив путей в список UL

У меня есть таблица в базе данных, которая содержит различные пути к страницам моего веб-сайта. Каждый путь указан только один раз. В настоящее время у меня есть очень длинная и запутанная серия запросов и 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 .= '",$topmark-$i); // Close off the Unordered Lists
                $MenuListOutput .= "\n";// For neatness
              }
              $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"; }

      , и она возвращает что-то вроде этого:

      
      

      Кто-нибудь знает, где мне нужно добавить дополнительную логику и как я могу этого добиться? Есть другие идеи, как это сделать лучше? Похоже, что это настолько распространенная проблема, что существует простой / стандартный метод решения чего-то вроде этого. Может быть, если бы я мог понять, как создать многомерный массив из моих путей, то их можно было бы повторить, чтобы эта работа работала?


      РЕДАКТИРОВАТЬ: Более сложный: Чтобы отобразить «имя» страницы, мне также нужно иметь эту информацию в массиве, поэтому путь, вероятно, лучше работает как ключ массива и имя в значении. Любые мысли об изменении, как это:

      $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].'';
      

      9
      задан Nisse Engström 5 July 2015 в 19:47
      поделиться