Проблема генерации вложенных списков ul с использованием PHP - PullRequest
3 голосов
/ 07 июня 2010

Я работаю над интерфейсным веб-приложением, в котором вложенный неупорядоченный список будет использоваться для плагина jQuery mcdropdown.

Вот структура данных из PHP: вложенный массив массивов:

Array
(
    [0] => Array
        (
            [fullpath] => ../foil/alphanumeric/
            [depth] => 0
        )

    [1] => Array
        (
            [fullpath] => ../foil/alphanumeric/letters/
            [depth] => 1
        )

    [2] => Array
        (
            [fullpath] => ../foil/alphanumeric/numbers/
            [depth] => 1
        )

    [3] => Array
        (
            [fullpath] => ../foil/alphanumeric/numbers/symbols/
            [depth] => 2
        )
)

В принципе, я взял отличный ответ от на этот вопрос на SO , немного его изменил:

global $fullpaths; // $fullpaths contains the above data structure in print_r
$result = '';
$currentDepth = -1;

while(!empty($fullpaths))
{
    $currentNode = array_shift($fullpaths);

    if($currentNode['depth'] > $currentDepth)
    {
        $result .='<ul>';
    }

    if($currentNode['depth'] < $currentDepth)
    {
        $result .=str_repeat('</ul>', $currentDepth - $currentNode['depth']);
    }

    $result .= '<li>'. $currentNode['fullpath'] .'</li>';

    $currentDepth = $currentNode['depth'];

    if(empty($fullpaths))
    {
        $result .= str_repeat('</ul>', 1 + $currentDepth);
    }
}

print $result;

и получил следующий вывод:

<ul>
    <li>../foil/alphanumeric/</li>
    <ul>
        <li>../foil/alphanumeric/letters/</li>
        <li>../foil/alphanumeric/numbers/</li>
        <ul>
            <li>../foil/alphanumeric/numbers/symbols/</li>
        </ul>
    </ul>
</ul>

Что не может быть принято плагином mcdropdown jQuery, он ожидает что-то вроде этого:

<li rel="1">
'Alphanumeric'
    <ul>
        <li rel="2">'Letters'</li>
        <li rel="3">'Numbers'
            <ul>
                <li rel="4">'Symbols'</li>
            </ul>
        </li>
    </ul>
</li>

Если честно, я не совсем понимаю, как работает ответ на этот вопрос, я пытался изменить это решение, чтобы справиться со своей ситуацией, но все же не смог.

Любая помощь и предложение очень присваиваются заранее.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Дает ли этот код (кроме отступа) желаемый результат?

$d = array(
  0 => array(
    'fullpath' => '../foil/alphanumeric/',
    'depth' => 0
    ),

  1 => array(
    'fullpath' => '../foil/alphanumeric/letters/',
    'depth' => 1
    ),

  2 => array(
    'fullpath' => '../foil/alphanumeric/numbers/',
    'depth' => 1
    ),

  3 => array(
    'fullpath' => '../foil/alphanumeric/numbers/symbols/',
    'depth' => 2
    )
  );

echo "<ul>\n";
$cdepth = 0; $rel = 1; $first = true; $veryfirst = true;
foreach($d as $e)
{
  $mpath = "'" . ucfirst(basename($e['fullpath'])) ."'";
  if ( $e['depth'] == $cdepth ) {
    if ( $first && !$veryfirst) { echo "</li>\n";}
    echo "<li rel=\"$rel\">", $mpath;
    $rel++; $first = false; $veryfirst = false;
  } else {
    $depthdiff = $e['depth'] - $cdepth;
    if ( $depthdiff < 0 ) {
      for($i = 0; $i < -$depthdiff; $i++) {
    echo "</ul>\n</li>\n";
      }
    } else {
      for($i = 0; $i < $depthdiff; $i++) {
    echo "\n<ul>\n";
    $first = true;
        // indeed buggy if $depthdiff > 1...
      }
    }
    echo "<li rel=\"$rel\">", $mpath, "\n";
    $rel++; $first = true;
  }
  $cdepth = $e['depth'];
}
for($i = 0; $i < $cdepth; $i++) {
  echo "</ul>\n</li>\n";
}
echo "</ul>\n";

РЕДАКТИРОВАННЫЙ код: Все еще не совершенен, но вы можете работать над этим ...: D

2 голосов
/ 07 июня 2010

Если у вас уже есть правильные значения глубины, вам не нужна рекурсия. У меня есть аналогичная функция, которую я использую для генерации

  • :
    function ulli($newlevel, &$level, $UL="ul", $once=1) {
    
      if ($level == $newlevel) {
         echo "</li>\n";
      }
    
      while ($level<$newlevel) {
         $level++;
         echo "\n  <$UL>\n";
      }
    
      while ($level>$newlevel) {
         if ($once-->0) { echo "</li>\n"; } 
         $level--;
         echo "  </$UL>"
         . ($level>0 ? "</li>" : "") . "\n";  // skip for final </ul> (level=0)
      }
    }
    

    Для справки нужна переменная текущего уровня $ (= $ currentDepth). И вы передаете ему свою глубину как $ newlevel. Однако первая глубина должна быть 1.

    Базовое использование похоже на:

    $currentDepth=0;
    foreach ($array as $_) {
       ulli($_["depth"]+1, $currentDepth);
       echo "<li>$_[path]";
    }
    ulli(0, $currentDepth);
    

    Ну, странно. Но у меня это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...