2010-08-19 16 views
5

Chcę dodać dwa różne atrybuty klasy do mojego pierwszego i czwartego znacznika <ol>, ale naprawdę nie wiem, jak dodać go do mojej funkcji rekursywnej? czy ktoś może mi pomóc?Problem funkcji rekursywnej PHP?

Oto mój skrypt PHP.

function make_list ($parent = 0, $parent_url = '') { 
    global $link; 
    echo '<ol>'; 

    foreach ($parent as $id => $cat) { 
     if($cat['parent_id'] == '0'){ 
      $url = $parent_url . $cat['url']; 
      echo '<li><a href="' . $url . '" title="' . $cat['category'] . ' Category Link" style="color: orange; font-weight: bold;">' . $cat['category'] . '</a>';    
     } else { 
      $url = $parent_url . $cat['url']; 
      // Display the item: 
      echo '<li><a href="' . $url . '" title="' . $cat['category'] . ' Category Link">' . $cat['category'] . '</a>'; 
     } 

     if (isset($link[$id])) { 
      make_list($link[$id], $url); 
     }    
     echo '</li>'; 
    }  
    echo '</ol>'; 
} 

$mysqli = mysqli_connect("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT * FROM categories ORDER BY parent_id, category ASC"); 
if (!$dbc) { 
    print mysqli_error(); 
} 

$link = array(); 

while (list($id, $parent_id, $category, $url, $depth) = mysqli_fetch_array($dbc)) { 
    $link[$parent_id][$id] = array('parent_id' => $parent_id, 'category' => $category, 'url' => $url, 'depth' => $depth); 
} 

make_list($link[0]); 

Wyjście

<ol> 
    <li>First Nested List</li> 
    <li>First Nested List</li> 
    <li>First Nested List 
     <ol> 
     <li>Second Nested List</li> 
     <li>Second Nested List</li> 
     <li>Second Nested List 
      <ol> 
      <li>Third Nested List</li> 
      <li>Third Nested List</li> 
      <li>Third Nested List 
       <ol> 
       <li>Fourth Nested List</li> 
       <li>Fourth Nested List</li> 
       <li>Fourth Nested List</li> 
       </ol> 
      </li> 
      <li>Third Nested List</li> 
      <li>Third Nested List</li> 
      </ol> 
     </li> 
     <li>Second Nested List</li> 
     <li>Second Nested List</li> 
     </ol> 
    </li> 
    <li>First Nested List</li> 
    <li>First Nested List</li> 
</ol> 
+0

Myślę, że rekursja jest niepotrzebna. Wykonujesz iterację po wszystkich kluczach, parach wartości tablicy. Wygląda na to, że masz problemy z uporządkowaniem zmiennych, których potrzebujesz. Używanie zmiennych wymaga wiele pracy. –

+0

@Peter Ajtai rekurencja jest niezbędna do prawidłowego wyświetlania kategorii, chyba że możesz wymyślić lepszy skrypt, który robi to samo? – GENx

+0

Powinieneś przekazać '$ link' i tylko to do' make_list', wtedy wygląda na to, że możesz użyć 1 foreach zagnieżdżonego w innym, aby iterować i tworzyć wszystkie odnośniki, które chcesz. Nie do końca rozumiem, co próbujesz zrobić, więc nie mogę udzielić szczegółowej odpowiedzi, ale jasne jest, że powinieneś iterować za pomocą '$ link'. –

Odpowiedz

4

Wystarczy dodać głębokość jako parametr. Następnie sprawdź, czy ma 0 lub 4 lub cokolwiek, czego potrzebujesz.

function make_list ($parent = 0, $parent_url = '', $depth=0) { 
... 
make_list($link[$id], $url, $depth+1); 
... 
+2

Nazwałbym to '$ depth'. – mpen

+0

@ Mark: Dobry pomysł. –

0

Dodaj globalną $num_links zmienną. Ilekroć emitujesz numer <ol>, zwiększ go. Dodaj atrybuty, gdy osiągnie żądane wartości.

Jeśli jednak to robisz, prawdopodobnie istnieje niezgodność między wybraną funkcją a zadaniem, które rozwiązujesz ... "Pierwszy lub czwarty" prawdopodobnie nie jest stanem rzeczywistym, który chcesz czek.

+0

@Borealid, że mnie zgubiłeś? – GENx

+0

@GENx: Wątpię, czego chcesz, "kiedy tylko wezwę tę funkcję, pierwsze i czwarte rzeczy, które stworzy, będą magiczne". To nie jest normalne. – Borealid

+0

A co powiesz na pierwszy tag 'ol'? – GENx

Powiązane problemy