Kom ihåg mig?
Home Menu

Menu


Hierakisk lista i php

Ämnesverktyg Visningsalternativ
Oläst 2004-08-05, 22:36 #1
festizs avatar
festiz festiz är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2004
Inlägg: 302
festiz festiz är inte uppkopplad
Flitig postare
festizs avatar
 
Reg.datum: Jun 2004
Inlägg: 302
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 ) ) )
festiz är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-08-06, 00:10 #2
Per Per är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2003
Inlägg: 719
Per Per är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2003
Inlägg: 719
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.
__________________
www.ip2nation.com (ip till land)
Per är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-08-06, 00:13 #3
festizs avatar
festiz festiz är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2004
Inlägg: 302
festiz festiz är inte uppkopplad
Flitig postare
festizs avatar
 
Reg.datum: Jun 2004
Inlägg: 302
på vilket sätt skiljer sig tabellstrukturen?
festiz är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-08-06, 00:20 #4
Per Per är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2003
Inlägg: 719
Per Per är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2003
Inlägg: 719
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;
  }
__________________
www.ip2nation.com (ip till land)
Per är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 15:35.

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