Jifer
11.05.2009, 14:53:48
No właśnie... jak nie przypisać zmiennej lub jak to ominąć?
Chciałbym uzyskać coś takiego:
wzory.php:
$wzor_1 = 10*$jakas_dana-$cos;
$wzor_2 = 5-$costam/2;
itd.
i taki plik includuje na początku skryptu, po czym kiedy mi jest potrzebny jakiś wzór, wykorzystuję go.
Z wiadomych przyczyn w.w. przykład działać nie może. Zmienne są od razu podmieniane.
np.
include("wzory.php");
$costam = 10;
$obliczenie_ze wzoru = $wzor_2;
Dodam, że wzorów jest od diabła i ciut ciut. Chcę je mieć w jednym pliku, by były łatwo dostępne.
Mam nadzieje, że rozumiecie o co mi chodzi.
(wiem, że mozna includować później, wtedy zostanie to obliczone, ale inkludowanie 150x pliku w którym jest n wzorów nie jest dobrym pomysłem)
melkorm
11.05.2009, 15:06:06
zainteresuj się pojęciem funkcji w php
Jifer
11.05.2009, 15:15:33
tylko czekałem na taką odpowiedź.....
to teraz łap.
Wzory mają od 3-30 zmiennych.
Nawet zakładając, że wpakuję do funkcji wszystkie dane w tablicy, to powiedz mi jak mam wybrać odpowiedni wzór do zwrócenia?
Mam napisać en if'ów, albo swich'ów?
Zastanawiałem się już niejednokrotnie jak to zrobić.
Jeśli przeoczyłem rozwiązanie, to podaj mi je lub podpowiedz, a nie oświecasz, że w PHP jest coś takiego jak funkcje.
sowiq
11.05.2009, 15:20:18
Cytat(Jifer @ 11.05.2009, 16:15:33 )

powiedz mi jak mam wybrać odpowiedni wzór do zwrócenia?
<?php
function wzorki($zmienne, $id_wzoru){
if($id_zworu == 1)
return 10 * $zmienne[0] + $zmienne[1];
elseif($id_wzoru == 2)
return 10 * $zmienne[1] + $zmienne[0];
else
return 0;
}
wzorki($tab, 1); // -> zapodaj wzór nr 1 dla zmiennych z tablicy $tab
wzorki($tab2, 2); // -> zapodaj wzór nr 2 dla zmiennych z tablicy $tab2
?>
Ew.
<?php
function wzor1($zmienne){...}
function wzor2($zmienne){...}
wzor1($tab); // -> zapodaj wzór nr 1 dla zmiennych z tablicy $tab
wzor2($tab2); // -> zapodaj wzór nr 2 dla zmiennych z tablicy $tab2
?>
Jifer
11.05.2009, 15:31:11
no i kolejny..... powaga myślicie, że na takie rozwiązanie bym nie wpadł?

Jak napisałem, wzorów jest od diabła. Na razie mam 180. Chorym pomysłem jest pisanie 180 warunków!
Również fajne jest robienie 180 funkcji :] dla mnie bomba.
Po to tu napisałem, żeby dowiedzieć się czy jest jakaś prosta i logiczna alternatywa.
Pewnie, mogę też zrobić funkcję:

<?php
function wzor($tab,$id){
$wzor[1] = ....;
$wzor[2] = ....;
...
return $wzor[$id];
}
?>
ale wtedy przy każdym wywołaniu funkcji realizowane są wszystkie wzory, z czego jeden jest zwracany. Chyba tez kiepski pomysł.
melkorm
11.05.2009, 15:38:38
Nie rozumiem, jak chcesz wywołać coś czego nie napisałeś ?

Skoro masz 180 wzorów to musisz je napisać, z nikąd się nie wezmą, a wywoływanie ... bo chyba pomysłu nie czaje

Masz plik ze wzorami (i tak musisz je zapisać, czy to będą funkcje czy co innego to już Twoja sparawa - funkcje moim zdaniem najbardziej logiczne) no i podtym wykonujesz obliczenia na tych wzorach, chyba czegoś naprawdę nie łapie.
sowiq
11.05.2009, 15:48:40
Cytat(Jifer @ 11.05.2009, 16:31:11 )

Chorym pomysłem jest pisanie 180 warunków!
To użyj
switch-case. Jakoś musisz decydować którego wzoru chcesz użyć. No chyba, że masz ambicje stworzyć sztuczną inteligencję. Ale 180 warunków/duży switch to IMO trochę mniej roboty

Zawsze możesz zrobić coś w stylu:
<?php
$w[0] = '3 * $zmienne['0'] + 14';
$w[1] = '18 * $zmienne['5'] - 8';
?>
eval()" title="Zobacz w manualu PHP" target="_manual
Jifer
11.05.2009, 16:09:06
hmmm.... no może wyraziłem się nie jasno... sam nie wiem. Jestem trochę zły, bo dzisiaj nie ogarniam prostych rzeczy :/ Może to przez tę pogodę.
Wszystkie w.w. przykłady są dobre. Tylko wymagają nieprzytomnej ilości kodu.
Nie wnikając co to są za wzory. Jest ich straszliwie dużo. Chcę mieć możliwość ich edycji i łatwy dostęp.
Zakładając, że mam tablicę $wartosc :
[1] = 2
[2] = 1
[3] = 0
[4] = 5
[5] = 1
oraz wzory dla poszczególnych pól w tablicy $wzory:
[1] = $wartosc_1 * 5;
[2] = $wartosc_2 * 2;
[3] = 40 * ( 0.5 * $wartosc_3 - $wartosc_3);
[4] = ...
[5] = ...
nie ma to większego znaczenia co jest w tych wzorach.
Ważne jest, że chcę by i jedno i drugie było w osobnym pliku.
po czym w skrypcie PHP mam coś takiego:
(to zadziała):
..obliczenia $wartości_1 i $wartości_3....
include("plik_ze_wzorami.php");
echo $wzory[1].$wzory[3];
..dalszy kod php...
..obliczenie $wartosci_2
include("plik_ze_wzorami.php');
echo $wzory[2];
ale to już nie:
include("plik_ze_wzorami.php");
..obliczenia $wartości_1 i $wartości_3....
echo $wzory[1].$wzory[3];
..kod php...
..obliczenia $wartości_2....
echo $wzory[2]
To przykład dla TYLKO 5 wzorów.
Chodzi mi o to, by wzory siedziały w jednym pliku, były w całości inkludowane jeden raz (a nie wielokrotnie, kiedy ich potrzebuję) i żebym mógł je wykorzystywać w różnych miejscach skryptu.
Gdyby to była kwestia 5-10 wzorów, to zrobienie kilku funkcji dla banalnych wzorów lub nawet jednej z parametrem wskazującym na te, która ma być zwrócona jest dobrym rozwiązaniem.
Przy tak dużej ilości wzorów wasze rozwiązania w zasadzie mijają się z celem, bo musiałbym zrobic masę funkcji, lub mieć 1000linijkowy kod zw wzorami, przekladany instrukcjami warunkowymi.
Mam nadzieje, że rozumiecie co chce osiągnąć i dlaczego w.w. rozwiązania mi nie pasują.
Stąd pytanie, czy w ogóle jest jakaś alternatywa :]
l0ud
11.05.2009, 16:27:52
Kolega naprowadził na rozwiązanie z eval().
<?php
$wzor_1 = '10*$dane[0]-$dane[1]';
$wzor_2 = '5-$dane[0]/2';
eval('$wynik = '.$wzor_1.';');
?>
Nie testowałem, ale powinno działać...
Jifer
11.05.2009, 16:53:06
sowiq chyba popełnił błąd w przykładnie, który podał, ale mniejsza. Niestety dokładnie o to mi chodziło. dostaje + (post powyżej pisałem w tym samym momencie co on)
Dlaczego niestety...
eval() powoduje nowe odwołanie się do kompilatora. Nie wykonuje się w ramach jednej kompilacji. Jest po prostu makabrycznie zasobożerny. Obawiam się, że zastosowanie funkcji eval będzie znacznie bardziej powolne niż zrobienie tony instrukcji warunkowych. Zwłaszcza dla takiej ilości wykonań.
Jeśli ktoś wpadnie na pomysł jak jeszcze to można inaczej rozwiązać, to zapraszam do dyskusji, chociaż obawiam się, że to by było na tyle :]
Wielkie dzięki.
l0ud
11.05.2009, 17:36:08
Skąd masz takie informacje o evalu? Kiedyś porównywałem szybkość include z file_get_contents i evalem. Różnice były naprawdę niewielkie...
Jifer
11.05.2009, 19:39:45
mam tylko informacje jak działa... nie wiem gdzie to znalazłem.
Bylo tylko napisane to co wyżej, że blok funkcji eval jest wysyłany do kompilatora, tak jakby to był osobny plik php.
Poszperałem teraz i znalazłem stronkę, na której to jest napisane. To gdzie to przeczytałem po raz pierwszy było po angielsku, ale nie mogę tego znaleźć teraz.
http://www.eioba.pl/a69983/inne_elementy_s...tawy_jezyka_phpco do file_get_content to zależy. Używam tej funkcji do pobierania danych z innej strony (gromadzę statystyki z gry MMO) we własnej bazie.
Serwery w grze są naprawdę dobre, mój chociaż wirtualny też jest szybki, a i tak pobieram max 6stron/1sekundę
Kwestia skąd bierzemy dane.
Jak 'mierzysz', porównujesz takie funkcje? Podejrzewam, że różnice można poczuć przy większej ilości wywołań/jednoczesnych wywołań.
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.