3 Stimmen

Problem beim Erstellen von verschachtelten ul-Listen mit PHP

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

Hier ist die Datenstruktur aus 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 ausgezeichnete Antwort aus dieser Frage auf SO genommen, ein wenig abgeändert:

global $fullpaths; // $fullpaths enthält die obige Datenstruktur in print_r
$result = '';
$currentDepth = -1;

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

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

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

    $result .= ''. $currentNode['fullpath'] .'';

    $currentDepth = $currentNode['depth'];

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

print $result;

und erhielt die folgende Ausgabe:

    ../foil/alphanumeric/

        ../foil/alphanumeric/letters/
        ../foil/alphanumeric/numbers/

            ../foil/alphanumeric/numbers/symbols/

Dies kann nicht vom mcdropdown jQuery-Plugin akzeptiert werden, es erwartet etwas wie folgt:

'Alphanumeric'

        'Letters'
        'Numbers'

                'Symbols'

Um ehrlich zu sein, verstehe ich nicht ganz, wie die Antwort aus dieser Frage funktioniert, ich habe versucht, diese Lösung auf meine Situation anzupassen, aber bin trotzdem gescheitert.

Jede Hilfe und Anregung wird im Voraus sehr geschätzt.

2voto

mario Punkte 141130

Wenn Sie bereits die korrekten Tiefenwerte haben, dann benötigen Sie keine Rekursion. Ich habe eine ähnliche Funktion, die ich für die Erstellung von

-* -Tags verwende:

    function ulli($newlevel, &$level, $UL="ul", $once=1) {

      if ($level == $newlevel) {
         echo "

\n"; } while ($level<$newlevel) { $level++; echo "\n <$UL>\n"; } while ($level>$newlevel) { if ($once-->0) { echo "\n"; } $level--; echo " " . ($level>0 ? "" : "") . "\n"; // überspringe abschließendes

(level=0) } }

Es benötigt eine aktuelle Variable $level als Referenz (=$currentDepth). Und Sie übergeben Ihre Tiefe als $newlevel. Es benötigt jedoch, dass die erste Tiefe 1 ist.

Die grundlegende Verwendung ist folgendermaßen:

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

Nun, eigenartig. Aber es hat bei mir funktioniert.

2voto

ShinTakezou Punkte 9154

Produziert dieser Code (Einzug abgesehen) 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 "\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 "\n";}
    echo "", $mpath;
    $rel++; $first = false; $veryfirst = false;
  } else {
    $depthdiff = $e['depth'] - $cdepth;
    if ( $depthdiff < 0 ) {
      for($i = 0; $i < -$depthdiff; $i++) {
    echo "\n\n";
      }
    } else {
      for($i = 0; $i < $depthdiff; $i++) {
    echo "\n\n";
    $first = true;
        // in der Tat fehlerhaft, wenn $depthdiff > 1...
      }
    }
    echo "", $mpath, "\n";
    $rel++; $first = true;
  }
  $cdepth = $e['depth'];
}
for($i = 0; $i < $cdepth; $i++) {
  echo "\n\n";
}
echo "\n";

EDITIERTER Code: Immer noch nicht perfekt, aber du kannst 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