Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL][PHP]Tablica z przedziałem wartości z BD
brzanek
post
Post #1





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
brzanek
post
Post #3





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Przykład, który pokazujesz, to nie zakres od 0 do 360, ale kilka zakresów. Rozwiązanie podałem Ci wyżej.
Go to the top of the page
+Quote Post
brzanek
post
Post #5





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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. );
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
brzanek
post
Post #7





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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 ...
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Tyle już jesteś na forum...

  1. $iconwiatr=array(
  2. '90' => "wiatr_poludnie",
  3. '100' => "wiatr_polnoc"
  4. );
Go to the top of the page
+Quote Post
brzanek
post
Post #9





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


Niestety tak nie zadziała bo potrzeba jest dokładna wartość nie tylko 90 ale w tym przypadku 97.

Ten post edytował brzanek 19.11.2018, 19:44:11
Go to the top of the page
+Quote Post
trueblue
post
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
brzanek
post
Post #11





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


To sobie zbuduj tablicę z przedziałami co 25, a nie co 10.
Go to the top of the page
+Quote Post
brzanek
post
Post #13





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #14





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
brzanek
post
Post #15





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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. );
Go to the top of the page
+Quote Post
trueblue
post
Post #16





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
brzanek
post
Post #17





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post
Post #18





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Serio chcesz tyle przedziałów pchać do jednego zapytania? Powodzenia...
Zobacz jak wygląda prawidłowa składnia funkcji CASE.
Go to the top of the page
+Quote Post
brzanek
post
Post #19





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post
Post #20





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
brzanek
post
Post #21





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


Podałeś odpowiedz? Może tak ale ja tego nie mogę zrozumieć i nie potrafię zamienić twoich słów na kod.
Go to the top of the page
+Quote Post
trueblue
post
Post #22





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
brzanek
post
Post #23





Grupa: Zarejestrowani
Postów: 429
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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ł.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 05:08