Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Preszukiwanie tablicy - przypisanie liczby do przedziału
Forum PHP.pl > Forum > PHP
Michael2318
mam tablicę:
  1. $array= array('36', '30', '24', '18', '12', '6');


oraz liczbę: 22
Jak zmusić php, aby wskazał mi, w którym miejscu w tablicy ($array) leży przedział do którego zalicza się ta liczba 22?
Obecnie ta liczba mieści się w przedziale 18 - 24 ponieważ jest większa od 18, ale mniejsza od 24.
Mam wielką nadzieję, że jest możliwość sprawdzenia tego, nie lecąc liczba po liczbie w tablicy $array, np. pętlą foreach() sad.gif

Dzięki.
artuross
1. Tablica zawsze jest posortowana czy niekoniecznie?
2. Jak w takim razie chcialbys sprawdzic czy liczba jest wieksza od najwiekszej liczby wystepujacej przed nia? Musisz przeiterowac tablice, zeby znalezc odpowiedni wynik. W kazdym razie jakie rozwiazanieby nie bylo, i tak PHP poleci liczba po liczbie smile.gif
Michael2318
Tak, tablica zawsze będzie posortowana w taki sposób, jaki zademonstrowałem.
mam już dwie pętle for, nie widzi mi się wrzucanie tam trzeciej pętli bo to będzie mało optymalne :/

Sprawdzanie czy liczba jest największa lub najmniejsza już z głowy:

  1. // sprawdzamy czy liczba należy do najwyższego przedziału
  2. if ( $dane[$j] >= $poziome[(count($poziome))] )
  3. {
  4. $y_end = $poziom_end[($poziome[(count($poziome))])];
  5. break;
  6. }
  7. else if ( $dane[$j] <= $poziome[0] ) // jeśli nie to sprawdzamy czy liczba należy do najniższego przedziału
  8. {
  9. $y_end = $poziom_end[0];
  10. break;
  11. }


Ale nie wiem co dalej, jak dalej szukać tego przedziału ;/
PS. Wyżej akurat zrobiłem tak, że jeśli liczba wykracza poza przedział to przypisana zostaje wartość największa (na przykładzie będzie to 36), a jesli jest znów mniejsza bądź równa liczbie najmniejszej z tablicy to właśnie ta najmniejsza liczba zostanie przypisana do zmiennej.
artuross
Jesli chodzi o optymalnosc, dalbym tam petle while, ktore sa szybsze.

Jesli chodzi o moje rozwiazanie, kodu nie dam, ale zrob tak:
- edit, a zapomnialem, zanim zaczniesz cokolwiek, wstaw to w funkcje i jezeli po pierwszej petli nie znajdzie wyniku to zwroc false
- zacznij iterowac od konca tabeli i idz do poczatku dopoki nie znajdziesz liczby mniejszej od Twojej,
- gdy znajdziesz, zapisz index elementu tablicy do zmiennej
- robisz kolejna petle, w ktorej szukasz pierwszej liczby wiekszej od podanej,
- gdy znajdziesz, zapisujesz index elementu do innej zmiennej
- na koncu wypisujesz sobie indexy, wartosci, czy co tam chcesz.
Michael2318
Prościej już chyba lecieć po kolei, jak znajdę w końcu liczbę większą od mojej to pobieram index tej liczby (to będzie liczba domykająca przedział). Index liczby otwierającej przedział będzie x-1, więc nawet nie trzeba szukać drugi raz smile.gif
Liczyłem po prostu że php udostępnia jakąś funkcję czy coś, co ułatwi mi szukanie 'od podstaw', no ale trudno.
Dzięki smile.gif
artuross
Aha, to te tablice nawet maja juz gotowe przedzialy...
sazian
  1.  
  2. $arr=array('36', '30', '24', '18', '12', '6');
  3.  
  4. $c=count($arr);
  5. $szukana=22;
  6. for($i=0;$i<$c;$i+=2)
  7. {
  8. $v1=each($arr);
  9. $v2=each($arr);
  10. if($v1!==false && $v2!==false)
  11. {
  12. if($szukana<=(int)$v1['value'] && $szukana>=(int)$v2['value'])
  13. {
  14. var_dump(array($v2['value'],$v1['value']));
  15. break;
  16. }
  17.  
  18. }
  19.  
  20. }
  21.  
Crozin
1. Ile jest elementów w takiej tablicy? Ponieważ przy liczbie kilki-kilkudziesięciu elementów nie ma nawet co sobie zawracać głowy "optymalnością".
2. Jeżeli tych elementów może być więcej, zainteresuj się tzw. wyszukiwaniem binarnym. Oczywiście tutaj musiałbyś dostosować algorytm tak by szukał przedziału, nie konkretnej wartości. Rozwiązanie to daje Ci złożoność obliczeniową rzędu O(log2n) w przeciwieństwie do zwykłego przelecenia tablicy pętlą o złożoności O(n)
Michael2318
OK, dzięki panowie. Dałem radę smile.gif
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.