Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zliczanie rekordów między wartościami
Forum PHP.pl > Forum > Przedszkole
miki_kol
Witam
Poszukuję rozwiązania które zliczy mi rekordy pomiędzy wystąpieniem danych wartości.

tabela
  1. Id | wartosc
  2. 1 | 1
  3. 2 | 4
  4. 3 | 3
  5. 4 | 2
  6. 5 | 3
  7. 6 | 4
  8. 7 | 1
  9. 8 | 2


Poszukuję rozwiązania za pomocą którego będę mógł otrzymać dane typu minimalny i maksymalny odstęp między wystąpieniem danej wartości.

Dzięki za wszelką pomoc
piotrek0
Nie za bardzo rozumiem co chcesz zrobić.
miki_kol
Chciałbym zliczyć rekordy występujące pomiędzy daną wartością... np
  1. Id | wartosc
  2. 1 | 1
  3. 2 | 4
  4. 3 | 3
  5. 4 | 2
  6. 5 | 3
  7. 6 | 4
  8. 7 | 1
  9. 8 | 2
  10. 9 | 3



między wartością 1 mamy 5 rekordów
między wartością 2 mamy 3 rekordy
między wartością 3 mamy 1 rekord i 3 rekordy
itd
Tyle że nie mm pojęcia jak to zliczyć automatem.

Z tego co wyjdzie wyciągnę sobie to co mnie interesuje czyli wartości min. i max. i to zapiszę do bazy.
piotrek0
  1. $x = mysql_query("select * from tabela");
  2.  
  3. while ($rekord = mysql_fetch_array($x))
  4. {
  5. $tablica[] = $rekord[0];
  6. }
  7. $wartość = 3;//na przykład 3
  8. $y = array_keys($tablica, $wartość);
  9.  
  10. echo "<pre>";
  11. print_r($y);
  12. echo "</pre>";
  13.  
  14. echo "<pre>";
  15. print_r($tablica);
  16. echo "</pre>";


Ten kod wypluje Ci do tablicy y wszystkie wystąpienia danej liczby w tablicy tablica podając ich klucz. dzięku temy masz tablicę pozycjami i możesz sobie poodejmować i porównać i co tam chcesz.
lobopol
Po pierwsze wyciągnij wszystkie zmienne do tablicy
  1. $tablica = array(
  2. 1,4,3,2,3,4,1,2,3,
  3. );


Tutaj inicjujesz sobie początkowe wartości
  1. $same_wartosci = array();
  2. foreach($tablica as $value){
  3. if(!isset($same_wartosci[$value])){
  4. $same_wartosci[$value] = array('min'=>NULL,'max'=>NULL); //tu będą zapisane wyniki najmniejszej i największej odległości dla danej wartości
  5. }
  6. }


A tu się dzieje cała magia
  1. foreach($same_wartosci as $key=>$value){ //lecimy po tablicy z samymi wartościami
  2. $i = 0;//taki kontroler ile było między
  3. foreach($tablica as $value2){//dla każdej wartości musimy przelecieć całą tablicę z liczbami
  4. if($i!=0){ //czy już trafiliśmy w aktualny klucz
  5. if($value2 != $key){ //czy trafiliśmy na tą samą wartość
  6. $i++; /nie trafiliśmy odległość się zwiększa
  7. }else{ //trafiliśmy trzeba zapisać
  8. $j = $i-1; //
  9. $i = 1;
  10. if( $same_wartosci[$key]['min']>$j || is_null($same_wartosci[$key]['min'])){//czy jest najmniejsza
  11. $same_wartosci[$key]['min'] = $j;
  12. }
  13. if($same_wartosci[$key]['max']<$j|| is_null($same_wartosci[$key]['min'])){//czy jest największa
  14. $same_wartosci[$key]['max'] = $j;
  15. }
  16. }
  17. }elseif($value2 == $key){//czy jesteśmy na odpowiednim kluczu
  18. $i=1;
  19. }
  20. }
  21.  
  22. }
  23. var_dump($same_wartosci);


przy tym przykładzie wynik:
  1. 1 =>
  2. 'min' => int 5
  3. 'max' => int 5
  4. 4 =>
  5. 'min' => int 3
  6. 'max' => int 3
  7. 3 =>
  8. 'min' => int 1
  9. 'max' => int 3
  10. 2 =>
  11. 'min' => int 3
  12. 'max' => int 3


Oczywiście to nie jest w pełni skończony skrypt, należy jeszcze uwzględnić takie przypadki jak liczba występująca tylko jeden raz
miki_kol
Wszystko fajnie. Dzięki lobopol. Zrobiłem twoją metodą i zadziałało... prawie tak jak chciałem. Prawie ponieważ trochę nie tak mi wyświetla.Poprawiłem to sobie. Pytanie jeszcze jedno mam... może trochę głupie ale ...
Wyświetla mi wartość min. i max. ... jak wyświetlić do jakiej wartości tablicy się to odnosi?

Czyli dla tablicy
  1. $tablica = array(1,4,3,2,3,4,1,2,3,1,2,3,1,);


otrzymuję wyniki:

? - min:2 / max:5
? - min:3 / max:3
? - min:1 / max:3
? - min:2 / max:3

jak przypisać poprawne wartości w miejsce ? ?

Przepraszam za moze banalne pytanie
lobopol
Przecież klucz tablicy jest wartością:
  1. to jest wartosc= 1 =>
  2. 'min' => int 5
  3. 'max' => int 5
  4. 4 =>
  5. 'min' => int 3
  6. 'max' => int 3
  7. 3 =>
  8. 'min' => int 1
  9. 'max' => int 3
  10. 2 =>
  11. 'min' => int 3
  12. 'max' => int 3

czyli w pętli to by było:
  1. foreach($same_wartosci as $key=>$value){
  2. echo 'dla wartości '.$key.' minimum to'.$value['min'].' a maksimum '.$value['max'];
  3. }
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.