ďťż
Podstrony
|
telcocafeMam taki plik:1 50 2 150 3 300 4 500 5 750 6 1050 7 1400 8 1800 9 2250 10 2750 (cyfry oddzielają tabulatory) moje pytanie brzmi: jak napisać funkcję, która poda pierwszą cyfrę na podstawie 2giej chodzi o to że jeżeli podam do funkcji np cyfrę 858 to funkcja zwróci '5' napisałem coś takiego ale nie wiem jak to dokończyć: function get($exp) { $open = fopen("file.txt", "r"); while($dane = fscanf($open, "%s\t%s\n")) { list($l, $d) = $dane; } bardzo proszę o pomoc! :) } Użytkownik PiKey edytował ten post 22 czerwiec 2007, 07:06 $liczby=array(0,50,150,300,500,750,1050,1400,1800,2250,2750); $rekord=10; // $liczby[$rekord] bądź $liczby[10] zawiera 2750. ale mi chodzi o to, że dane są zapisanie w pliku: 1 <tabulator> 50 2 <tabulator> 150 3 <tabulator> 300 i jeżeli podam 150, zwróci 2, jeżeli 156, także 2 Poniższe rozwiązanie nie będzie zbyt wydajne. Może są lepsze sposoby na uzyskanie tego wyniku. $liczby = file('adres_do_pliku'); $liczba = 5; //czy inna zmienna bądź wartość $ile=count($liczby); //bądź wpisz od razu do pętli FOR odp. wartość for($i=0,$ii=0;$i<$ile;++$i,++$ii) { if($x > $liczby[$i] && $x < $liczby[$ii]) { $r1 = $x - $liczby[$i]; $r2 = $liczby[$ii] - $x; if($r1 < $r2) { $rekord=$liczby[$i]; } else { $rekord=$liczby[$ii]; } } } zaraz przetestuję :) @edit: no nie bardzo o to mi chodziło ale zaraz pokombinuje zrobić coś na podstawie Twojego kodu @edit nie można użyć funkcji file() ponieważ dane są zapisane TAK: 1<tablulator>50 2<tablulator>150 3<tablulator>300 4<tablulator>500 5<tablulator>750 6<tablulator>1050 7<tablulator>1400 8<tablulator>1800 9<tablulator>2250 10<tablulator>2750 do tego będzie potrzebna funkcja fscanf() i otóż pytanie... jak to zrobić? :/ Użytkownik PiKey edytował ten post 22 czerwiec 2007, 07:43 Niekoniecznie - możesz użyć funkcji EXPLODE("\t", $x); pomocy! zrobiłem coś takiego ale nie działa :( function get_level($x) { $liczby = file('exp.txt'); $ile = count($liczby); for($i=0,$ii=1;$i<$ile;$i++,$ii++) { $dane = explode("\t", $liczby[$i]); $poziom = $dane[0]; $doswiadczenie = $dane[1]; $dane2 = explode("\t", $liczby[$ii]); $poziom2 = $dane2[0]; $doswiadczenie2 = $dane2[1]; if($x >= $doswiadczenie and $x < $doswiadczenie2) { return $poziom; break; } } } Po co w pliku trzymać numerki leveli, skoro i tak są po kolei? Przecież wystarczy trzymać liczbę expa potrzebną na dany level, a numerek levela można wyddedukować na podstawie linijki ;) No ale skoro tak już masz, to spróbuj tego:function getLevel($exp) { $levels = file('t.txt'); $i=0; $myLv = 0; foreach ($levels as $lv) { $levels[$i] = explode("\t",$lv); if ($levels[$i][1] <= $exp) $myLv = $levels[$i][0]; else return $myLv; $i++; } return $myLv; } no nie moge ;/ nic mi nie działa może pomożesz mi napisać skrypt, tak jak mówisz, że dane są zapisane bez numerków leveli w pliku? ;) Przeciez to prawie to samo. function getLevel($exp) { $levels = file('t.txt'); $myLv = 0; foreach ($levels as $lv) { if ($lv <= $exp) $myLv++; else return $myLv; } return $myLv; } W sumie to jeśli założyć, że exp potrzebny na kolejne levele jest uporządkowany rosnąco, to można to zrobić wydajniej (wyszukiwanie binarne). Zaraz coś takiego naskrobię, bo się nudzę ;> edit: voila <?php function upperBound($needle, $haystack) { $high = count($haystack); $low = 0; while ($high - $low > 1) { $probe = floor(($high + $low) / 2); if ($haystack[$probe] < $needle) { $low = $probe; } else { $high = $probe; } } if ($haystack[$high] == $needle) $high++; return $high; } function getLevel($exp) { $levels = file('t.txt'); $myLv = upperBound($exp, $levels); return $myLv; } echo getLevel(300); ?> Użytkownik bryn edytował ten post 22 czerwiec 2007, 19:29 no.. działa w końcu ;p aa zapomniałem: Thx X) ARGH!! WSZYSTKO DZIAŁA TYLKO JEŻELI ZROBIĘ TAK: [..] $dane = mysql_fetch_array($query); echo $dane['exp']; // 300 echo getLevel($dane['exp']); TO FUNKCJA ZWRACA MI JAKIES LICZBY KOŁO 1000 :/ Użytkownik PiKey edytował ten post 24 czerwiec 2007, 07:52 |
|||
Sitedesign by AltusUmbrae. |