Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Procentowy postęp danych uzupełnionych w bazie.
Forum PHP.pl > Forum > Przedszkole
casperii
Witam, chcę wykonać procentowy poziom/postęp uzupełnienia profilu. Zastanawiam się nad szybszym sposobem tego wykonania.
Ja bym zrobił coś na styl:

  1. if(!empty($imie)){
  2. $procent = 5;
  3. }
  4.  
  5. if(!empty($nazwisko)){
  6. $procent = 5;
  7. }
  8.  
  9. if(!empty(adres)){
  10. $procent = 5;
  11. }


ale to jest czasochłonne i nie wyobrażam sobie analizowania tego gdybym np. w bazie miał 100 pól a do tego jeszcze sumowanie itd.
Reasumując chcę wykonać poziom procentowy w jakim profil usera jest wypełniony.
session
Wszystko zależy od tego jak zaprojektowana jest baza, jeśli wszystkie wymagane pola są w jednej tabeli sprawa jest bardzo prosta. Przez wymagane rozumiem te pola, które mają być brane pod uwagę przy zliczaniu postępu. Liczysz sobie ilość wszystkich pół (odejmując np. ID, itp.), a następnie ile z nich jest pustych. Dzieląc ilość nie pustych przez wszystkie masz procentowy postęp.

  1. $row=mysqli_fetch_array($result); // tutaj rezulat zapytania (select) jako tablica
  2. $all=count($row);
  3. $not_empty=$all-count(array_filter($row));
  4. $percentage=ceil($not_empty/$all);


Trzeba jednak tutaj uważać, bo array_filter bez dodatkowych parametrów wyrzuci wszystko co zwraca false, czyli np: null, pusty string, ale również 0.
casperii
Cytat(session @ 23.05.2015, 19:02:36 ) *
Wszystko zależy od tego jak zaprojektowana jest baza, jeśli wszystkie wymagane pola są w jednej tabeli sprawa jest bardzo prosta. Przez wymagane rozumiem te pola, które mają być brane pod uwagę przy zliczaniu postępu. Liczysz sobie ilość wszystkich pół (odejmując np. ID, itp.), a następnie ile z nich jest pustych. Dzieląc ilość nie pustych przez wszystkie masz procentowy postęp.

  1. $row=mysqli_fetch_array($result); // tutaj rezulat zapytania (select) jako tablica
  2. $all=count($row);
  3. $not_empty=$all-count(array_filter($row));
  4. $percentage=ceil($not_empty/$all);


Trzeba jednak tutaj uważać, bo array_filter bez dodatkowych parametrów wyrzuci wszystko co zwraca false, czyli np: null, pusty string, ale również 0.



No właśnie baza oparta jest na 3 tabelkach.. Ale to chyba i tak nie problem bo przecież array przez ciebie podany oparty jest o result.
session
Zgadza się, jednak bardziej chodziło mi o to, że jeśli selectem wyciągałbyś wszystko z tabeli to znalazłyby się tam też pola, które nie mają wpływu na procentowy postęp, do uzupełnienia profilu w 100% nie koniecznie wymagane jest, aby podać wszystkie dane. Rozwiązanie jest ogólnie uniwersalne, ale poprawność wyniku zależy od selecta, a właściwie przemyślenia czy zliczam tylko to co powinienem.
casperii
Cytat(session @ 23.05.2015, 19:37:01 ) *
Zgadza się, jednak bardziej chodziło mi o to, że jeśli selectem wyciągałbyś wszystko z tabeli to znalazłyby się tam też pola, które nie mają wpływu na procentowy postęp, do uzupełnienia profilu w 100% nie koniecznie wymagane jest, aby podać wszystkie dane. Rozwiązanie jest ogólnie uniwersalne, ale poprawność wyniku zależy od selecta, a właściwie przemyślenia czy zliczam tylko to co powinienem.


A jeśli w selecie bym wywołał tylko te pola które chcę? np select imie, nazwisko, adres from table; ?
session
Cytat
A jeśli w selecie bym wywołał tylko te pola które chcę?

Właściwie to do tego zmierzałem smile.gif Wtedy wszystko będzie poprawnie.
casperii
@session a więc tak:

$all=count($row2); // zwraca mi 27.
$not_empty=$all-count(array_filter($row2)); // zwraca mi 1 - ale czemu ?
$percentage=ceil($not_empty/$all); // zwraca mi 1.
session
Przykład
Jak widać kod działa w tym przydadku poprawnie, aby uzystać wynik w % należy pomnożyć wewnątrz ceil *100. Zrób
Kod
var_dump($row2);
i sprawdź ile jest pustych pól, możliwe jest też, że masz jakieś defaulty poustwiane w bazie.
casperii
Cytat(session @ 23.05.2015, 20:17:27 ) *
Przykład
Jak widać kod działa w tym przydadku poprawnie, aby uzystać wynik w % należy pomnożyć wewnątrz ceil *100. Zrób
Kod
var_dump($row2);
i sprawdź ile jest pustych pól, możliwe jest też, że masz jakieś defaulty poustwiane w bazie.


Tak mam defaulty, a da się jakoś wykluczyć pola które mają coś domyślnie ustawione ? No chyba że je po prostu nie będę brać pod uwagę.
A może w inny deseń czy da się zrobić zapytanie ale zamiast wypisywać wszystkie pola prócz np 3 pól to zrobić tak by zrobić zapytanie oprócz pola1, pola2, pola3 ?

select oprócz pole1 ,pole 2, pole3 from table;
session
Wtedy można wykorzystać drugi parametr array_filter, czyli callback, który będzie sprawdzał czy dana wartość znajduje się w tablicy, w której podasz swoje defaulty.
  1. function is_default($var){
  2. $defaults=array('default1','default2','default3');
  3. if(in_array($var,$defaults) || $var=='' || $var===NULL){
  4. return false;
  5. }else{ return $var; }
  6. }
  7. $not_empty=$all-count(array_filter($row2,"is_default"));


W tym przypadku nie jest to wydajne rozwiązanie, ale też pewnie nie masz ogromnej bazy. Kolejnym problemem jest to, że musisz zdefiniować defaulty. W takiej sytuacji zastanawiałbym się, czy nie dodać malego pola do tabeli i do niego wpisywać ilość wypełnionych pól, albo postęp. Pole to wypełniasz przy insercie i update'ach. Wartość tego pola możesz obliczyć zgodnie z poprzednim kodem tylko jako $row daj $_POST, w którym użytkownik uzupełnia dane, o ile w formularzu masz puste pola bez default. Ewentualnie wtedy możesz sprawdzać tylko niektóre pola czy nie są takie jak default i dekrementować wartość licznika.

Co do ostatniego: Select EXPECT, niestety wymaga do dodatkowej tabeli tymczasowej w bazie i jest to bardzo nieefektywne, lepiej tego nie stosować jeśli nie trzeba.
casperii
@session jest jeszcze jeden problem z tym kodem. Jeżeli w bazie mam pole typu INT to nie jest ono brane pod uwagę, bo otrzymuje z automatu 0. Próbowałem już z NULL ale to nic nie daje.

Dobra już sobie poradziłem. Temat uznaje za skończony. Można ten temat zamknąć.
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.