ďťż

[php] pobranie jednego rekordu na podstawie.. ..licznika

       

Podstrony


telcocafe

Mam 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
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.