Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Tablica z przedziałem wartości z BD
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam napotkałem problem przy tworzeniu tablicy array
  1. $iconwiatr=array(
  2. '>=90 && <100' => "wiatr_poludnie",
  3. '>=100 && <120' => "wiatr_polnoc"
  4. );

Tym sposobem wyświetlam odpowiednią ikonkę
  1. $wiatrikona = imagecreatefrompng('http://brzanek.webd.pl/2019/strona/prognoza/images/'.$iconwiatr[($row['wwindBearing'])].'.png');

Niestety wywala mi błąd
  1. Notice: Undefined offset: 97 in /home/brzanek/public_html/2019/strona/prognoza/temperatura.php on line 150 Warning: imagecreatefrompng(http://brzanek.webd.pl/2019/strona/prognoza/images/.png): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/brzanek/public_html/2019/strona/prognoza/temperatura.php on line 150 Warning: imagecopy() expects parameter 2 to be resource, boolean given in /home/brzanek/public_html/2019/strona/prognoza/temperatura.php on line 196

W bazie danych wartość wwindBearing = 97 więc powinna być widoczna ikona bo ta wartość znajduje się w tym przedziale >=90 && <100
trueblue
Naprawdę uważasz, że jeśli przypiszesz elementowi tablicy klucz '>=90 && <100', to podając 97 wybierzesz właśnie ten element?
Powinieneś utworzyć tablicę gdzie kluczami są wartości z dołu lub góry zakresu - w zależności od sposobu podejścia do wybierania.
brzanek
Ale zakres to od 0 do 360 Chyba jest jakiś inny sposób aby zrobić to w danym zakresie np:
od 0 do 70
od 70 do 140
od 140 do 190
od 190 do 260
od 260 do 330
od 330 do 360
trueblue
Przykład, który pokazujesz, to nie zakres od 0 do 360, ale kilka zakresów. Rozwiązanie podałem Ci wyżej.
brzanek
Możesz jaśniej.
Pobierana wartość z bazy danych jest w zakresie od 0 do 360 więc może być to liczba w tym zakresie.
Mam to tak robić?
  1. $iconwiatr=array(
  2. ...
  3. '97' => "wiatr_poludnie",
  4. '96' => "wiatr_poludnie",
  5. '95' => "wiatr_poludnie",
  6. '94' => "wiatr_polnoc",
  7. '93' => "wiatr_polnocnyzachod"
  8. ...
  9. );
trueblue
Tablicę z ikonami powinieneś zbudować tak, aby kluczem była dolna lub górna wartość przedziału. Nie przedziału, w którym zawiera się badana liczba, lecz przedziału, z którym porównujesz. Czyli tabela, którą pokazałeś na początku, i o której cały czas piszę, że jest niepoprawnie zbudowana.
brzanek
Teraz to już nic nie kumam zakręciłeś mnie w tym wszystkim.
Podaj mi jakiś przykład z podobnymi wartościami to może lepiej mi to wejdzie, bo po twoim ostatnim poście jestem zakręcony jak ...
trueblue
Tyle już jesteś na forum...

  1. $iconwiatr=array(
  2. '90' => "wiatr_poludnie",
  3. '100' => "wiatr_polnoc"
  4. );
brzanek
Niestety tak nie zadziała bo potrzeba jest dokładna wartość nie tylko 90 ale w tym przypadku 97.
trueblue
A nie wydaje Ci się, że 97 wpada w przedział między 90 a 100? Czyli powinieneś na podstawie tej tabeli podstawić ikonę wiatr_poludnie?
Jak sobie zbudujesz przedziały, to już Twoja sprawa. Na pewno nie ma kompletnie sensu robienie czegoś takiego:
  1. '97' => "wiatr_poludnie",
  2. '96' => "wiatr_poludnie",
  3. '95' => "wiatr_poludnie",

Jeszcze raz: jako klucz tabeli ma być dolna, albo górna granica przedziału.
brzanek
Może inaczej mam 8 ikonek z kierunkiem wiatru. W bazie danych kierunek wiatru wyrażany jest w stopniach od 0 do 360. Potrzebuję wyświetlać ikonę z kierunkiem wiatru ale nie co 1 stopień tylko np. co 25 stopni - dlatego potrzebny jest mi przedział w tablicy.
trueblue
To sobie zbuduj tablicę z przedziałami co 25, a nie co 10.
brzanek
Co 25 czyli?
  1. $iconwiatr=array(
  2. '25' => "wiatr_poludnie",
  3. '50' => "wiatr_polnoc",
  4. '75' => "wiatr_polnoc"
  5. );

Jeszcze raz podkreślam, że tak to nie działa.
Tym wywołaniem wyświetlam ikonę
  1. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =9 ORDER BY id ASC LIMIT 1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $wiatrikona = imagecreatefrompng('http://brzanek.webd.pl/2019/strona/prognoza/images/'.$iconwiatr[($row['wwindBearing'])].'.png');
  4. }

Jeśli teraz wwindBearing wynosi 74 to ta tablica
  1. $iconwiatr=array(
  2. '25' => "wiatr_poludnie",
  3. '50' => "wiatr_polnoc",
  4. '75' => "wiatr_polnoc"
  5. );

nie zadziała bo nie ma w niej wartości 74.
trueblue
Cytat(trueblue @ 19.11.2018, 19:46:33 ) *
A nie wydaje Ci się, że 97 wpada w przedział między 90 a 100? Czyli powinieneś na podstawie tej tabeli podstawić ikonę wiatr_poludnie?

A 74 gdzie wpada? Nie przyszło Ci na myśl, który element z tablicy wybrać na podstawie zadanej wartości?
brzanek
Chyba mam dzisiaj ciężki dzień bo coraz gorzej mi to idzie.
Kombinuję jeszcze z tym
  1. foreach (range(90, 100) as $liczba) {
  2. echo $liczba;
  3. }
  4.  
  5. $iconwiatr=array(
  6. $liczba = "wiatr_poludnie"
  7. );
trueblue
Fatalnie.

Lecisz po tablicy, sprawdzasz czy zadana wartość jest większa lub równa od klucza pierwszego elementu, jeśli tak, to zapisujesz na boku wartość klucza. Przechodzisz do kolejnego elementu. Jeśli warunek w danym momencie nie jest spełniony, to klucz jest szukanym kluczem i wskazuje na odpowiedni przedział.

A skoro wykorzystujesz bazę danych, to zrób to jednym zapytaniem: http://kawalekkodu.pl/kochanie-trzeba-brac...-w-przedzialach
brzanek
Kombinuję trochę z zapytaniem
  1. $result = $mysqli->query("SELECT wtemperatureMax, wwindGust, wicon, wwindBearing AS wiatr, CASE WHEN wwindBearing>=50 AND wwindBearing<90 THEN 'wiatr_poludnie' WHEN wwindBearing>=90 AND wwindBearing<100 THEN 'wiatr_poludnie' WHERE wid_miasto =9 ORDER BY id ASC LIMIT 1");
  2. while ( $row = mysqli_fetch_array($result) ) {
  3. $tempmax14 = ''.$row['wtemperatureMax'].'';
  4. $ikona14 = ''.$icon[($row['wicon'])].'';
  5. $wiatr = ''.$row['wwindGust'].'';
  6. $wiatrikona = imagecreatefrompng('http://brzanek.webd.pl/2019/strona/prognoza/images/'.$row['wiatr'].'.png');
  7. $imagee14 = imagecreatefrompng('http://brzanek.webd.pl/2019/strona/prognoza/images/'.$row['wicon'].'.png');
  8. }

Ale pojawia mi się w tej linii błąd
trueblue
Serio chcesz tyle przedziałów pchać do jednego zapytania? Powodzenia...
Zobacz jak wygląda prawidłowa składnia funkcji CASE.
brzanek
Nie chcę ale kombinuję jak mogę.
Więc jak powinno to wyglądać z tablicą array?
Po twoich wypowiedziach niestety nic mi nie przychodzi do głowy.
trueblue
Nie przesadzaj podałem Ci dwa rozwiązania. W tym jednego gotowca, a Ty wymyślasz wciąż coraz bardziej karkołomne rozwiązania.

Pisałem o tym w poście nr 16. Sprawdzasz po kolei wartość z kluczami tablicy.
brzanek
Podałeś odpowiedz? Może tak ale ja tego nie mogę zrozumieć i nie potrafię zamienić twoich słów na kod.
trueblue
W linku, który podałem jest gotowiec. Wystarczy, że stworzysz dodatkową tabelę z zakresami, zamiast tworzyć ją w PHP. W opisie temperatury umieszczasz nazwę ikony.

Jeśli tworzysz tablicę w PHP, którą zresztą podałeś:
  1. $iconwiatr=array(
  2. '25' => "wiatr_poludnie",
  3. '50' => "wiatr_polnoc",
  4. '75' => "wiatr_polnoc"
  5. );


To masz w niej odszukać element, który spełnia Twoje kryteria. Ma to być pętla for, w której sprawdzasz czy szukana wartość jest większa lub równa kluczowi czy nie.
Czyli dla wartości 27 jest ona większa lub równa od pierwszego klucza, ale mniejsza od drugiego. Czyli to ten klucz.
Dla wartości 60, jest ona większa lub równa od pierwszego, ale i drugiego, ale też mniejsza od trzeciego. Czyli drugi klucz.

Serio? Naprawdę nie potrafisz napisać pętli for i porównać szukane wartości z kluczem tablicy?
brzanek
Dzięki za nakierowanie jednak po nocy człowiek dużo lepiej myśli.
Utworzyłem nową tabelę i tam dałem zakresy od do i nazwy ikonek
Potem tylko zapytanie
  1. $result = $mysqli->query("
  2. SELECT t.wwindBearing,zt.kierunek, wid_miasto
  3. FROM prognoza AS t, kierunek_wiatru AS zt
  4. WHERE t.wwindBearing>=zt.od AND t.wwindBearing<zt.do AND wid_miasto =9 LIMIT 1
  5. ");
  6. while ( $row = mysqli_fetch_array($result) ) {
  7. $wiatrikona = imagecreatefrompng('images/'.$row['kierunek'].'.png');
  8. }

Raz jeszcze dzięki + poleciał.
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.