2011-05-26 8 views
7

Tengo una matriz multidimensional en PHP producida por los grandes ejemplos de cio y ftrotter (soy arreglo utilice ftrotterrs en la variante matrices):PHP matriz multidimensional de la lista desordenada, la construcción de ruta URL

Turn database result into array

He hecho esto en un ancho de lista desordenado este método:

public function outputCategories($categories, $startingLevel = 0) 
{ 
    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    if (count($category['children']) > 0) 
    { 
     echo "<li>{$category['menu_nl']}\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     echo "<li>{$category['menu_nl']}</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

Hasta ahora todo bien.

Ahora quiero usar el campo url_nl para construir las direcciones URL usadas como enlaces en el menú. La url tiene que reflejar el departamento del enlace en el árbol agregando/url_nl para cada paso en el árbol.

Mi objetivo:

- item 1 (has link: /item_1) 
    * subitem 1 (has link: /item_1/subitem_1) 
    * subitem 2 (has link: /item_1/subitem_1) 
     * subsubitem 1 (has link: /item_1/subitem_2/subsubitem_1) 
- item 2 (has link: /item_2) 

la tabla

id 
id1 (parent id) 
menu_nl 
url_nl 
title_nl 
etc 

Lo que tengo hasta ahora:

public function outputCategories($categories, $link, $start, $startingLevel = 0) 
{ 
    // if start not exists 
    if(!$start) 
    $start = $startingLevel; 

    echo "<ul>\n"; 
    foreach ($categories as $key => $category) 
    { 
    $link.= "/".$category['url_nl']; 

    if($start != $startingLevel) 
     $link = strrchr($link, '/'); 

    if (count($category['children']) > 0) 
    { 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)\n"; 
     $this->outputCategories($category['children'], $link 
           , $start, $startingLevel+1); 
     echo "</li>\n"; 
    } 
    else 
    { 
     $start = $startingLevel+1; 
     echo "<li>".$start." - ".$startingLevel. 
      "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
    } 
    } 
    echo "</ul>\n"; 
} 

Como se puede ver en el ejemplo que he utilizado un campo url_nl cual es recursivamente agregado para que cada nivel de la lista tenga un enlace con una ruta que se usa como una url.

De todos modos, tengo problemas para crear estos enlaces, ya que no se restablecen correctamente al pasar a la lista jerárquica. Después de bajar al niño en la lista, el primero es correcto, pero el segundo no.

estoy atrapado aquí ...

+0

es posible que desee reemplazar 'if (! $ Start)' con 'if (! Isset ($ start))'. – Johan

+0

¡Buena sugerencia! – Klaaz

Respuesta

1

Parece que modifica la variable $ enlace dentro del bucle foreach, Así que se agrega a elemento1 $, presilla a través de sus subelementos y regresa a la primera iteración y añadir elemento2 a la variable ...

sustituir este

$link .= "/".$category['url_nl']; 

con

$insidelink = $link . "/".$category['url_nl']; 

(y cambie el enlace $ restante dentro del bucle a $ insidelink)

Agregando: Esto también es cierto para $ startingLevel. No lo modifique, utilice 1 en línea:

echo "<li>".$start." - ".$startingLevel +1. 
    "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n"; 
+0

Lo cambié rápidamente porque tengo que irme ahora mismo. ¡Se ve bien! El pensamiento claro es la solución aquí, ¡creo que mi mente estaba un poco preocupada! ¡Gracias! – Klaaz

1

Aquí es una manera más fácil:

$ = InArray su matriz multidimensional aquí. Utilicé directory_map en codeigniter para obtener los contenidos del directorio incluyendo sus subdirectorios.

$this->getList($filelist2, $filelist); 
foreach ($filelist as $key => $val) { 
    echo $val; 
} 

function getList($inarray, &$filelist, $prefix='') { 
    foreach ($inarray as $inkey => $inval) { 
     if (is_array($inval)) { 
      $filelist = $this->getList($inval, $filelist, $inkey); 
     } else { 
      if ($prefix) 
       $filelist[] = $prefix . '--' . $inval; 
      else 
       $filelist[] = $inval; 
     } 
    } 

    return $filelist; 
} 
Cuestiones relacionadas