Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] kody CPV, jak stworzyć strukturę drzewa
sieradz
post 29.06.2020, 13:55:13
Post #1





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

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


Cześć,

czy ktoś kiedyś spotkał się z problemem generowania i poruszania się po zagnieżdżonym drzewie kodów CPV?

Kody CPV (Wspólny Słownik Zamówień) to taka ogólnie stosowana lista branż.

Kody CPV są tutaj: https://kody.uzp.gov.pl/ CPV->widok drzewiasty

Jak wyświetlić takie drzewo mając tylko listę kodów CPV w bazie MySQL, którego postać określa zagnieżdżenie tak, że:

- dwie pierwsze cyfry określają działy: XX000000-Y,
- trzy pierwsze cyfry określają grupy: XXX00000-Y,
- cztery pierwsze cyfry określają klasy: XXXX0000-Y,
- pięć pierwszych cyfr określa kategorie: XXXXX000-Y.

Próbuje to ogarnąć, ale ilość zapętleń i zapytań do bazy danych (przy tworzeniu tablicy z zagnieżdzonymi kodami) jest tak dużo, że skrypt zamula ekstremalnie.
Jak podejść do tematu? Nie chodzi mi o gotowe rozwiązanie ale o pomysł, może istnieją jakieś algorytmy do obsługi tego sposoby prezentowania danych?

Ten post edytował sieradz 29.06.2020, 13:56:06
Go to the top of the page
+Quote Post
nospor
post 29.06.2020, 14:34:45
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Ile w sumie jest wszystkich kodow?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 29.06.2020, 14:36:20
Post #3





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

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


Cytat(nospor @ 29.06.2020, 15:34:45 ) *
Ile w sumie jest wszystkich kodow?


9454 i 6 zagnieżdzeń
Go to the top of the page
+Quote Post
nospor
post 29.06.2020, 14:38:10
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No to teraz pytanie jak chcesz generowac to drzewo. Czy cale od razu czy ajaxem dociagac dane w miare rozwijania.
Jak cale od razu, to wczytaj normalnie do php wszystkie kody a potem w php sobie przygotuj strukture drzewiasta.

Jak doczytywac AJAXem to juz w ogole zadna filizofia


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 29.06.2020, 14:47:06
Post #5





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

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


Cytat(nospor @ 29.06.2020, 15:38:10 ) *
No to teraz pytanie jak chcesz generowac to drzewo. Czy cale od razu czy ajaxem dociagac dane w miare rozwijania.
Jak cale od razu, to wczytaj normalnie do php wszystkie kody a potem w php sobie przygotuj strukture drzewiasta.

Jak doczytywac AJAXem to juz w ogole zadna filizofia


problem mam właśnie z przygotowaniem struktury drzewiastej. Na różne sposoby kombinuje i im więcej zagnieżdżeń tym bardziej muli.
Go to the top of the page
+Quote Post
nospor
post 29.06.2020, 15:25:11
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No ci przeciez napisalem: nie masz robic tysiaca zapytan do bazy, tylko jednym zapytaniem pobrac wszystkie kody i w php ladnie to przerobic. JEDNO zapytanie do bazy PO WSZYSTKO


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 2.07.2020, 14:14:17
Post #7





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

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


Cytat(nospor @ 29.06.2020, 16:25:11 ) *
No ci przeciez napisalem: nie masz robic tysiaca zapytan do bazy, tylko jednym zapytaniem pobrac wszystkie kody i w php ladnie to przerobic. JEDNO zapytanie do bazy PO WSZYSTKO


  1. public function list_subcpv_array($array, $cpv){
  2. $countzero = substr_count(substr($cpv, -8, 8), '0');
  3. $cpv = explode("-", $cpv);
  4. $countrealcode = 8 - $countzero;
  5. $realcode = substr($cpv[0], 0, $countrealcode);
  6. $subcountzero = $countzero - 1;
  7. $pattern = "'^{$realcode}[1-9]{1}[0]{{$subcountzero}}[\-]{1}[1-9]{1}'";
  8. $tree = preg_grep ($pattern, $this->array_column($array, 'cpv'));
  9.  
  10. foreach( $tree as $k=>$v ) {
  11. $trees[$k][title] = $array[$k][PL];
  12. $trees[$k][cpv] = $array[$k][cpv];
  13. $trees[$k][child] = $this->list_subcpv_array($array,$array[$k][cpv]);
  14. }
  15.  
  16. return $trees;
  17. }


Napisałem taki kod tworzący tablicę o strukturze drzewa. Podaje się array, który ma w sobie wszystkie rekordy pobrane z bazy mysql oraz kod cpv który ma być rodzicem. Przy CPV który jest najbardziej ogólny trochę zamula. Mógłbym prosić o sugestię jak przyśpieszyć ten skrypt?

Ten post edytował sieradz 2.07.2020, 14:14:49
Go to the top of the page
+Quote Post
nospor
post 2.07.2020, 14:24:55
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Co to robi
$this->array_column($array, 'cpv')
?
Czemu nie phpopwe array_column i czemu w ogole przekazujesz wielowymiarowa tablice? Czemu nie plaska tablice z samymi kodami pcv. Z tego co widze to tutaj do wyliczen nic wiecej ci nie jest potrzebne. A teraz odpalasz bez sensu array_column tyle razy ile masz rekordow. Masz 9tys rekordow to odpalasz to 9tysiecy razy...

Rowniez pattern sprawdzasz za kazdym razem na calej tablicy. A po co masz sprawdzac cos co juz dawno zostalo uzyte? Tylko generujesz pelna mase niepotrzebnych sprawdzan


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 2.07.2020, 14:34:55
Post #9





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

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


mam starą wersję PHP więc dodałem taki zamiennik tej funkcji:

  1. function array_column(array $input, $columnKey, $indexKey = null) {
  2. $array = array();
  3. foreach ($input as $value) {
  4. if ( !array_key_exists($columnKey, $value)) {
  5. trigger_error("Key \"$columnKey\" does not exist in array");
  6. return false;
  7. }
  8. if (is_null($indexKey)) {
  9. $array[] = $value[$columnKey];
  10. }
  11. else {
  12. if ( !array_key_exists($indexKey, $value)) {
  13. trigger_error("Key \"$indexKey\" does not exist in array");
  14. return false;
  15. }
  16. if ( ! is_scalar($value[$indexKey])) {
  17. trigger_error("Key \"$indexKey\" does not contain scalar value");
  18. return false;
  19. }
  20. $array[$value[$indexKey]] = $value[$columnKey];
  21. }
  22. }
  23. return $array;
  24. }


Przeszukuje tym wielowymiarowe tablice, zeby znalezc miejsce gdzie umiescic kolejne głębsze tablice . A jak zrobić płaską tablice i operować na zagłębieniach: wyświetlać wszystkie, tylko dzieci itd? Można bez tablic wielowymiarowych? Na początku pytałem się o jakiś pomysł na algorytm.
Go to the top of the page
+Quote Post
nospor
post 2.07.2020, 14:51:12
Post #10





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004





Wez odpal ten $this->array_column tylko raz przed wszystkim i do funkcji przekazuj cale $array oraz splaszczone $array - chodzi o to bys nie odpalal 9tys razy tej koszmarnej funkcji. Bez sensu robota

Oraz nie generuj bez sensu bledow

$trees[$k][title] = $array[$k][PL];
zamien na
$trees[$k]['title'] = $array[$k]['PL'];

Analogicznie reszta.

I az boje sie zapytac: na jakiej w takim razie wersji php teraz pracujesz?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 2.07.2020, 15:10:46
Post #11





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

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


Cytat(nospor @ 2.07.2020, 15:51:12 ) *
Wez odpal ten $this->array_column tylko raz przed wszystkim i do funkcji przekazuj cale $array oraz splaszczone $array - chodzi o to bys nie odpalal 9tys razy tej koszmarnej funkcji. Bez sensu robota

Oraz nie generuj bez sensu bledow

$trees[$k][title] = $array[$k][PL];
zamien na
$trees[$k]['title'] = $array[$k]['PL'];

Analogicznie reszta.

I az boje sie zapytac: na jakiej w takim razie wersji php teraz pracujesz?


zmieniłem według sugestii i faktycznie znacznie przyśpieszyło, dzięki. Wersja php 5.2

Ten post edytował sieradz 2.07.2020, 15:11:51
Go to the top of the page
+Quote Post
nospor
post 2.07.2020, 15:11:59
Post #12





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




I jeszcze by przyspieszylo jakbys preg_grep lecial tylko po nie uzytych jeszcze elementach a nie po wszystkich jak teraz. Bo zakladam ze tego jeszcze nie poprawiles


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 2.07.2020, 15:23:54
Post #13





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

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


Cytat(nospor @ 2.07.2020, 16:11:59 ) *
I jeszcze by przyspieszylo jakbys preg_grep lecial tylko po nie uzytych jeszcze elementach a nie po wszystkich jak teraz. Bo zakladam ze tego jeszcze nie poprawiles


dodałem unset($array_flat[$k]);

  1. public function list_subcpv_array($array, $cpv, $array_flat){
  2. $countzero = substr_count(substr($cpv, -8, 8), '0');
  3. $cpv = explode("-", $cpv);
  4. $countrealcode = 8 - $countzero;
  5. $realcode = substr($cpv[0], 0, $countrealcode);
  6. $subcountzero = $countzero - 1;
  7. $pattern = "'^{$realcode}[1-9]{1}[0]{{$subcountzero}}[\-]{1}[1-9]{1}'";
  8. $tree = preg_grep ($pattern, $array_flat);
  9. foreach( $tree as $k=>$v ) {
  10. $trees[$k]['title'] = $array[$k]['PL'];
  11. $trees[$k]['cpv'] = $array[$k]['cpv'];
  12. $trees[$k]['child'] = $this->list_subcpv_array($array,$array[$k]['cpv'],$array_flat);
  13. unset($array_flat[$k]);
  14. }
  15. return $trees;
  16. }
Go to the top of the page
+Quote Post
nospor
post 2.07.2020, 15:28:58
Post #14





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Tablica to nie obiekt. Robiac zmiany w tablicy w funkcji, zmiany nie sa widoczne poza funkcja a co z kolei za bardzo nic nie poprawia w tym co masz. Musisz przekazac te tablice jako referencja

public function list_subcpv_array($array, $cpv, &$array_flat){


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sieradz
post 2.07.2020, 15:36:10
Post #15





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

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


Cytat(nospor @ 2.07.2020, 16:28:58 ) *
Tablica to nie obiekt. Robiac zmiany w tablicy w funkcji, zmiany nie sa widoczne poza funkcja a co z kolei za bardzo nic nie poprawia w tym co masz. Musisz przekazac te tablice jako referencja

public function list_subcpv_array($array, $cpv, &$array_flat){


cenna rada, dzięki
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: 28.03.2024 - 13:19