3 Stimmen

Problem bei der Erstellung verschachtelter ul-Listen mit PHP

Ich arbeite an einem Front-End-Web-App, wo eine verschachtelte ungeordnete Liste für das jQuery-Plugin mcdropdown verwendet werden würde.

Hier ist die Datenstruktur von PHP: ein verschachteltes Array von Arrays:

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
        )
)

Im Grunde genommen habe ich die hervorragende Antwort von diese Frage zu SO , ein wenig verändert:

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;

und erhielt die folgende Ausgabe:

<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>

Was das jQuery-Plugin mcdropdown nicht akzeptieren kann, da es etwas wie dieses erwartet:

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

Um ehrlich zu sein, verstehe ich nicht ganz, wie die Antwort auf diese Frage funktioniert. Ich habe versucht, diese Lösung zu ändern, um mit meiner Situation fertig zu werden, bin aber trotzdem gescheitert.

Jede Hilfe und Anregung ist im Voraus sehr willkommen.

2voto

mario Punkte 141130

Wenn Sie bereits die richtigen Tiefenwerte haben, brauchen Sie keine Rekursion. Ich habe eine ähnliche Funktion, die ich für die <ul>-<li>-Erzeugung verwende:

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)
  }
}

Sie benötigt eine aktuelle $level-Variable als Referenz (=$currentDepth). Und Sie übergeben ihm Ihre Tiefe als $newlevel. Die erste Tiefe muss jedoch 1 sein.

Die grundlegende Verwendung ist wie folgt:

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

Nun, schrullig. Aber für mich hat es funktioniert.

2voto

ShinTakezou Punkte 9154

Erzielt dieser Code (ohne Einrückung) das gewünschte Ergebnis?

$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";

BEARBEITETER Code: Immer noch nicht perfekt, aber man kann daran arbeiten... :D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X