WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hierakisk lista i php (https://www.wn.se/forum/showthread.php?t=3008)

festiz 2004-08-05 22:36

Jag skall göra en hierarkisk lista likt komplett.se
Datorkomponenter > CPU > Intel
På sidan där print_r($tree) körs, körs precis ovan $tree=where_in_tree(3,sv_SE)

Dock så får jag just nu en massa arrayer i varandra, hjälp snälla, jag vill bara ha en lång array med en massa namn i, id-numren skulle vara bra att ha också så man kan göra korrekta länkar av dem. Jag förstår självklart att arrayen måste kastas om så att sist är först osv.

Tabellen prodcat:
Kod:

id en_ENnamn sv_SEnamn subcat
1 Datorkomponenter Computercomponents
2 CPU CPU 1
3 Intel Intel 2

Funktionen för att spara i en array:
Kod:

function where_in_tree($id,$lang) {
        //$id är värdet som är i den nuvarande kategorins id-kolumn.
        //$lang är som vanligt språkvariabeln som skickas runt för att få rätt språk på allting.
        $row=mysql_fetch_assoc(mysql_query("SELECT * FROM prodcat WHERE id='$id'"));
 $namn=$row[$lang . 'namn'];
 $cat[] = $namn;
 $subcat=$row['subcat'];
 if($subcat)
        $cat[]=where_in_tree($subcat,$lang);
        echo $cat;
  return $cat;
}

print_r på den returnerade variabeln ståendes i kategorin Intel ger detta:
Kod:

ArrayArrayArrayArray ( [0] => Intel [1] => Array ( [0] => CPU [1] => Array ( [0] => Datorkomponenter ) ) )

Per 2004-08-06 00:10

Gör om tabellstrukturen till:

id,
parent,
en_name,
sv_name

Få in allt i en array genom:

Kod:

$result = mysql_query('SELECT * FROM table');
while ( $row = mysql_fetch_array($result) ) {
  $arr[$row['parent']][] = $row;
}

Nu har du istället en multidimensionell array som är hyfsat lätthanterlig.

Kod:

function recursive_output($array, $parent) {
  for ( $i = 0; $i < count($array[$parent]); $i++ ) {
    echo $array[$parent][$i]['en_name'];
    echo '<br />';
    recursive_output($array, $array[$parent][$i]['id']);
  }
}

recursive_output($arr, 0);

Det blir mer lättöverskådligt och enklare att hantera. Har inte testkört koden eller tagit hänsyn till minneskonsumtion men det borde fungera.

festiz 2004-08-06 00:13

på vilket sätt skiljer sig tabellstrukturen?

Per 2004-08-06 00:20

Citat:

Originally posted by festiz@Aug 6 2004, 00:13
på vilket sätt skiljer sig tabellstrukturen?
id, autoincrement, primary key
parent, idt på föräldern till den här kategorin (0 om det är en huvudkategori)

(Jag föredrar att ha det på det viset.)

Jag kanske missuppfattade, du vill bara skriva ut "vägen" för en enskild produkt eller?

I så fall borde följande fungera, förutsatt att det är tabellstrukturen jag nämnde tidigare (du kanske behöver köra array_reverse eller likn).

Kod:

  function recursive_output_path($id, $lang) {
    static $_recursive_output_path;
   
    $row = mysql_fetch_assoc(mysql_query('SELECT * FROM prodcat WHERE id = ' . $id));
   
    if ( $row['parent'] > 0 ) {
      $_recursive_output_path[] = $row[$lang . '_name'];
      recursive_output_path($row['parent'], $lang);
    } else {
      $_recursive_output_path[] = $row[$lang . '_name'];
    }
   
    return $_recursive_output_path;
  }



Alla tider är GMT +2. Klockan är nu 18:14.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson