Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewo kategorii
Forum PHP.pl > Forum > PHP
010100000100100001010000
Witam,

Mam dość spory problem, a dokładniej dostałem tak wyglądające drzewo kategorii:

CODE
...
Dom i Ogród/Narzędzia/Klucze
Dom i Ogród/Narzędzia/Lutownice
Dom i Ogród/Narzędzia/Piły i pilarki
Dom i Ogród/Narzędzia/Pozostałe
Dom i Ogród/Narzędzia/Przyrządy miernicze/Miary i taśmy
Dom i Ogród/Narzędzia/Przyrządy miernicze/Pozostałe
Dom i Ogród/Ogród/Narzędzia ogrodnicze/Kosy i podkaszarki
Dom i Ogród/Ogród/Narzędzia ogrodnicze/Noże ogrodnicze
...


Teraz zależy mi aby zbudować z tej struktury drzewo w pliku .csv:

CODE
"nazwa";"id";"rodzic"
"Kategoria Główna 1";"101";"100"
"Kategoria Główna 2";"102";"100"
"Podkategoria 1";"103";"101"
"Podkategoria 2";"104";"102"
"Podkategoria 3";"105";"102"
"Podkategoria 4";"106";"102"
"Podkategoria 5";"107";"102"
"Podkategoria 6";"108";"107"
...


Kiedyś przyznam się robiłem coś takiego, ale to było X lat temu i nie potrafię tego przeskoczyć, po prostu nie wiem czy to czasowe czy trwałe zaćmienie umysłu sciana.gif

W każdym razie jestem otwarty na wskazówki, bo raczej ręczna obróbka kilku tysięcy rekordów to nieciekawa sprawa.

---
Z góry dziękuję za odpowiedź oraz cenne wytyczne php.gif
markuz
Wskazówka:
  1. $lines = explode("\n", $data);
  2. $categories = array_map(function($line) {
  3. explode("\n", $line);
  4. }, $lines);
010100000100100001010000
Ta cześć jest mniej więcej mi znana, jednak problemem jest to że nie dostaję kategorii w piramidzie, tylko jak widać dostaję ścieżkę do głównej domyślnej końcówki - czyli muszę tutaj dla pierwszych elementów głównych nadać ID i muszę też pamiętać że pod tym rekordem jest też początek zawierający ponownie to samo... - w zasadzie nie wiem czy dobrze przekazałem moją myśl co_jest.gif
trueblue
1. Rozbijasz ścieżkę (np. według sposobu podanego wyżej).
2a) Jeśli jest to kategoria główna i nie ma takiej w bazie, to wstawiasz.
2b) Jeśli jest to podrzędna, to sprawdzasz po całej ścieżce czy istnieje taka podkategoria w bazie. Przy braku wstawiasz (z id ostatniego rodzica sprawdzanej ścieżki).
010100000100100001010000
Cytat(trueblue @ 13.07.2017, 19:23:26 ) *
1. Rozbijasz ścieżkę (np. według sposobu podanego wyżej).
2a) Jeśli jest to kategoria główna i nie ma takiej w bazie, to wstawiasz.
2b) Jeśli jest to podrzędna, to sprawdzasz po całej ścieżce czy istnieje taka podkategoria w bazie. Przy braku wstawiasz (z id ostatniego rodzica sprawdzanej ścieżki).


Tak dokładnie wiem i chyba tak zrobię opierając się o bazę danych, bo chciałem to załatwić na pliku .csv jednak tutaj mi to wygląda dość ciężką kwestią, a tak kiedyś to wykonałem na bazie i potem wyeksportowałem sobie gotowy plik, jednak fajnie byłoby mieć gotowe takie rozwiązanie bez opierania się o dodatkowe technologie.
trueblue
Czyli nie chcesz w ogóle wstawiać tego do bazy nawet po obróbce?
Jeśli tak, to przetwarzane dane przechowuj w tabeli PHP (do niej wrzucaj i ją przeszukuj), a na koniec wygeneruj z niej plik.
010100000100100001010000
I tutaj pojawia się problem z tabelami, czy możesz podpowiedzieć coś więcej? jak to ugryźć, trochę się gubię akurat w tej kwestii
trueblue
Wstawianie elementu: $kategorie[] = array('nazwa' => 'Kategoria Główna 1', 'id' => 100, 'rodzic' => 101);

http://php.net/manual/en/language.types.array.php
http://php.net/manual/en/ref.array.php

Czego nie wiesz?
010100000100100001010000
Mam coś takiego:

  1. $data = file_get_contents('kategorie.csv');
  2.  
  3. echo '"NAZWA";"ID";"RODZIC"';
  4. $lines = explode("\n", $data);
  5. $categories = array_map(function($line) {
  6. explode("\n", $line);
  7. }, $lines);
  8. foreach ($lines as $klucz => $wartosc){
  9. echo '<p>"'.$wartosc.'";"'.$klucz.'"</p>';
  10. }


i problem staje mi już tutaj, jak zlikwidować powtarzające się kategorie i wiązać z nimi podkategorie
trueblue
To co zrobiłeś, można nazwać parsowaniem pliku. Nie traktuje tego co masz jako dane wynikowe, ale źródłowe i postępuje z nimi jak opisałem wyżej (punkty 1 i 2).
010100000100100001010000
Powiedzieć łatwo, natomiast zrealizować już gorzej ;/
trueblue
Może Ci posłuży: https://stackoverflow.com/questions/7498119...e-with-csv-file
Nie ma tam chyba sprawdzania czy nazwa podkategorii się powtarza (a może tak się zdarzyć w przypadku podkategorii w innej ścieżce). No i jest założenie do 5 poziomów.
markuz
W moim kodzie był błąd. Explode w array_map powinien rozdzielać na podstawie "/" a nie "\n";
Pyton_000
A może: http://kvz.io/blog/2007/10/03/convert-anyt...uctures-in-php/ questionmark.gif wink.gif
010100000100100001010000
Cytat(markuz @ 13.07.2017, 22:32:28 ) *
W moim kodzie był błąd. Explode w array_map powinien rozdzielać na podstawie "/" a nie "\n";


Wiem, sam nie dopatrzyłem, po ciężkim dniu pracy biggrin.gif
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.