Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Drzewo kategorii, Generator więzów kategoria-rodzin z otrzymanych ścieżek kategorii
0101000001001000...
post 13.07.2017, 17:46:55
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


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

Ten post edytował 010100000100100001010000 13.07.2017, 17:48:46
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
markuz
post 13.07.2017, 17:49:59
Post #2





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


Wskazówka:
  1. $lines = explode("\n", $data);
  2. $categories = array_map(function($line) {
  3. explode("\n", $line);
  4. }, $lines);


--------------------
Go to the top of the page
+Quote Post
0101000001001000...
post 13.07.2017, 18:06:18
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


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

Ten post edytował 010100000100100001010000 13.07.2017, 18:08:17
Go to the top of the page
+Quote Post
trueblue
post 13.07.2017, 18:23:26
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).

Ten post edytował trueblue 13.07.2017, 18:24:45


--------------------
Go to the top of the page
+Quote Post
0101000001001000...
post 13.07.2017, 18:27:59
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


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.

Ten post edytował 010100000100100001010000 13.07.2017, 18:28:35
Go to the top of the page
+Quote Post
trueblue
post 13.07.2017, 18:33:41
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
0101000001001000...
post 13.07.2017, 18:35:44
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


I tutaj pojawia się problem z tabelami, czy możesz podpowiedzieć coś więcej? jak to ugryźć, trochę się gubię akurat w tej kwestii
Go to the top of the page
+Quote Post
trueblue
post 13.07.2017, 18:38:41
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
0101000001001000...
post 13.07.2017, 19:17:12
Post #9





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post 13.07.2017, 19:25:39
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).


--------------------
Go to the top of the page
+Quote Post
0101000001001000...
post 13.07.2017, 19:30:20
Post #11





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


Powiedzieć łatwo, natomiast zrealizować już gorzej ;/
Go to the top of the page
+Quote Post
trueblue
post 13.07.2017, 20:08:35
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
markuz
post 13.07.2017, 21:32:28
Post #13





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


W moim kodzie był błąd. Explode w array_map powinien rozdzielać na podstawie "/" a nie "\n";


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 14.07.2017, 07:24:03
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A może: http://kvz.io/blog/2007/10/03/convert-anyt...uctures-in-php/ questionmark.gif wink.gif
Go to the top of the page
+Quote Post
0101000001001000...
post 14.07.2017, 07:29:16
Post #15





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.07.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 14:04