Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] kody CPV
Forum PHP.pl > Forum > PHP
sieradz
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?
nospor
Ile w sumie jest wszystkich kodow?
sieradz
Cytat(nospor @ 29.06.2020, 15:34:45 ) *
Ile w sumie jest wszystkich kodow?


9454 i 6 zagnieżdzeń
nospor
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
sieradz
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.
nospor
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
sieradz
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?
nospor
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
sieradz
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.
nospor

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?
sieradz
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
nospor
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
sieradz
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. }
nospor
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){
sieradz
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
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.