Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klasą, tworzącą drzewa
Forum PHP.pl > Forum > PHP
thomson89
Witam!

Dziś mam problem z klasą która tworzy drzewka z tablic. Błąd to:
Kod
Warning: Invalid argument supplied for foreach() in /home2/gla10000/public_html/sklep/panel_administracyjny/funkcje/tree.php on line 74


Kod klasy mam stąd.

Ściągnąłem, tak dla testu do mojego skryptu:
  1. $polaczenie = new baza;
  2. $query = 'SELECT * FROM kategorie';
  3. $wynik = mysql_query($query);
  4. $tabelka = mysql_fetch_assoc($wynik);
  5. $out = array();
  6. while($row = mysql_fetch_assoc($wynik)) {
  7. $out[] = $row;
  8. }
  9.  
  10. $oTree = new Tree( $out );
  11. $oTree->createTree();
  12.  
  13. foreach( $oTree->getTree1D() as $k => $v ){
  14. echo str_repeat( ' ', $v['level']*5 ).'- '.$v['nazwa']."\n";
  15. // klucz level, jest tworzony wewnątrz klasy,
  16. // jego nazwę można zmienić używając metody setLevelRowName()
  17. }


Oczywiście w klasie zmieniłem nazwy pól na własne (poprawne):
  1. private $idRowName = 'id';
  2. private $parentRowName = 'id_kategori_wyzszej';
  3. private $columnRowName = 'nazwa';
  4. private $levelRowName = 'level';


Wszystko wydaje się być dobrze wpisane w skrypt, a jednak - nie działa. Błąd który się pokazuje jest w klasie. Ale powoduje go mój kawałek kodu który ją wywołuje.

Proszę o pomoc!
jang
  1. $treeID = $oTree->getTree1D();
  2. foreach( $treeID as $k => $v ){
  3. echo (str_repeat( ' ', $v['level']*5 ).'- '.$v['nazwa']."\n");
  4. }
everth
Dopisz sobie przed linią 74 w Tree
  1. if (!$array) return;

Nie gwarantuje że zadziała.
Autor sam podaje że jego klasa nie jest dobra i rzeczywiście nie jest. Lepsze przykłady klas Tree znajdziesz na PhpClasses.org.
thomson89
Nie działa nadal: te same błędy.
everth
No to zmień klasę.
jang
Cytat(thomson89 @ 4.08.2010, 22:07:46 ) *
Nie działa nadal: te same błędy.

Oprócz tego,że uraczyłeś nas genialną odpowiedzią, zrobiłeś jeszcze cokolwiek ?
Wrzuciłeś chociaż do tłumacza google co ta za błąd ?
  1. Warning: Invalid argument supplied for foreach()

  1. $treeID = $oTree->getTree1D();
  2. print_r($treeID);
Jest to tablica ? bo napewno nie.

http://www.phpriot.com/articles/nested-trees-2/3
http://www.edutech.ch/contribution/nstrees/
http://blog.bexlab.pl/category/technologie/sql-technologie/
http://articles.sitepoint.com/article/hier...data-database/2
thomson89
A po co mi tłumacz, skoro doskonale wiem co oznacza błąd? Nie wiem tylko jak to naprawić. Wszystko jest tak ja w przykładzie (a przykład działa), a tutaj nie.

To co jest w tych linkach, to powiedzmy - zbędne. Potrzebuję tylko prostego wylistowania.
jang
Cytat(thomson89 @ 4.08.2010, 22:35:15 ) *
Nie wiem tylko jak to naprawić.

Taki właśnie jest stan Twojej wiedzy na temat tego błędu.

Cytat(thomson89 @ 4.08.2010, 22:35:15 ) *
To co jest w tych linkach, to powiedzmy - zbędne.
Zbędny jest Ci mózg bo i tak nie potrafisz go używać a na dodatek jesteś śmierdzącym leniem i czekasz na gotowca. Tego sklepu ludzie z forum za Ciebie nie napiszą.
Wystarczyło tylko klikąć w jeden z linków i poczytać :
http://blog.bexlab.pl/struktura-drzewiasta...ury-drzewa/417/

ale poco skoro ktoś podrzuci gotowca ...
thomson89
Jak już napisałem jest to zbędne. Tamta klasa zainteresowała mnie tylko dlatego, że oferowała nieograniczone listowanie kategorii, w prosty sposób. Coś co prezentujesz za pomocą linka jest swoistym wykresem.

Proszę mnie nie obrażać.

Gotowca nie oczekuję. Podczas gdy temat sobie leży na forum, ja nie czekam na gotowca lecz sam też coś próbuje wykodzić z własnych umiejętności. I nie oczekuję, by ktoś z forum pisał za mnie sklep - samemu sprawia mi to ogromną frajdę.

I tak, problem jest z tablicą którą przekazuje do funkcji, jednakże sprawdzając ją (print_r) wychodzi na to że wszystko jest w porządku.


muk4
Znalazłem jakąś moją starą funkcję do zagnieżdżania komentarzy:
  1. function show_comments($news_id, $comm_id=0, $nest_lvl=0){
  2. $margin_value = $nest_lvl*15;
  3. $res = mysql_query("SELECT * FROM `komentarze` WHERE `reply`='$comm_id' AND `news_id`='$news_id' ORDER BY `date`");
  4. if(mysql_num_rows($res) == '0'){ return 0;
  5. }else{
  6. while($koment = mysql_fetch_assoc($res)){
  7. echo "<span style=\"margin-left:{$margin_value}px;\">{$koment['id']} | {$koment['reply']} | {$koment['content']} | {$koment['date']} </span><br />";
  8. show_comments($news_id, $koment['id'], $nest_lvl+1);
  9. }
  10. }
  11. };
  12. //przykład:
  13. show_comments($id_newsa);

Być może zrobisz z niej użytek.
everth
Teoretycznie powinno przebudować płaski wynik na drzewo (nie testowane);
  1. $id = array_walk($input,function($val) {return $val['id']);
  2. $names = array_walk($input,function($val) {return $val['name']);
  3. $parent = array_walk($input,function($val) {return $val['parent']);
  4.  
  5. function toTree(&$parent,&$names,&$id,$child_id=0,$level=0) {
  6. $result = array();
  7. $keys = array_search($parent,$child_id);
  8. foreach ($keys as $key) {
  9. $row = array();
  10. $row['value'] = $names[$key];
  11. $row['level'] = $level;
  12. $row['id'] = $id[$key];
  13. $row['children'] = toTree($parent,$names,$id, $id[$key],$level++);
  14. $result[] = $row;
  15. }
  16. return $result;
  17. }
  18.  
  19. $res = toTree($parent,$names,$id);
jang
Cytat(thomson89 @ 4.08.2010, 23:24:10 ) *
Coś co prezentujesz za pomocą linka jest swoistym wykresem.

Wykres to jest coś takiego : http://www.google.com/images?rls=pl&q=...ved=0CCQQsAQwAA

a to : http://blog.bexlab.pl/wp-content/uploads/2009/11/tree_05.PNG
i to : http://blog.bexlab.pl/wp-content/uploads/2...11/tree_06b.PNG
to są drzewka
Cytat(thomson89 @ 4.08.2010, 23:24:10 ) *
Proszę mnie nie obrażać.
...
Tamta klasa zainteresowała mnie tylko dlatego, że oferowała nieograniczone listowanie kategorii, w prosty sposób.

No cóż jeśli to : http://luq10.wordpress.com/2010/03/17/drze...-obsluga-w-php/
jest prostsze od tego :
  1. SELECT
  2. concat( repeat('-', COUNT(parent.id) - 1),child.title)
  3. AS title,
  4. child.id
  5. FROM tree AS child,
  6. tree AS parent
  7. WHERE child.lft BETWEEN parent.lft AND parent.rgt
  8. GROUP BY child.id
  9. ORDER BY child.lft

albo od tego : http://articles.sitepoint.com/article/hier...data-database/2
to faktycznie muszę Ci przeprosić ...
Jesteś śmierdzącym leniem któremu nie chce się niczego przeczytać ani sprawdzić kawałka kodu.
Cytat(thomson89 @ 4.08.2010, 23:24:10 ) *
Jak już napisałem jest to zbędne. Tamta klasa zainteresowała mnie tylko dlatego, że oferowała nieograniczone listowanie kategorii, w prosty sposób. Coś co prezentujesz za pomocą linka jest swoistym wykresem.

Proszę mnie nie obrażać.

Skoro umiesz używać mózgu to może mi wyjaśnisz jaka jest różnica pomiędzy :
  1. - Kategoria 1
  2. - Kategoria 1.1
  3. - Kategoria 1.1.1
  4. - Kategoria 1.1.2
  5. - Kategoria 1.2
  6. - Kategoria 2
  7. (...)

a tym : http://blog.bexlab.pl/wp-content/uploads/2009/11/tree_09.PNG
?
no dobra ja Ci napiszę, to pierwsze to TEKST a to z mojego linku to zdjęcie albo obrazek jak wolisz ...

Mam dla Ciebie takie propozycje:
1. naucz się czytać
2. naucz się myśleć
3. naucz się korzystać z podpowiedzi innych
4. zacznij naukę tutaj : http://www.php.net/manual/pl/
5. za jakieś 7 lat zapraszam do działu PRZEDSZKOLE
Spawnm
@jang okaż za grosz kultury bo dostaniesz warna.

@thomson89 - forum nie parser.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.