Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Trzymanie wzory w innym miejscu.
Forum PHP.pl > Forum > Przedszkole
Jifer
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
zainteresuj się pojęciem funkcji w php smile.gif
Jifer
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
Cytat(Jifer @ 11.05.2009, 16:15:33 ) *
powiedz mi jak mam wybrać odpowiedni wzór do zwrócenia?

  1. <?php
  2. function wzorki($zmienne, $id_wzoru){
  3.    if($id_zworu == 1)
  4.        return 10 * $zmienne[0] + $zmienne[1];
  5.    elseif($id_wzoru == 2)
  6.        return 10 * $zmienne[1] + $zmienne[0];
  7.    else
  8.        return 0;
  9. }
  10. wzorki($tab, 1); // -> zapodaj wzór nr 1 dla zmiennych z tablicy $tab
  11. wzorki($tab2, 2); // -> zapodaj wzór nr 2 dla zmiennych z tablicy $tab2
  12. ?>

Ew.
  1. <?php
  2. function wzor1($zmienne){...}
  3. function wzor2($zmienne){...}
  4. wzor1($tab); // -> zapodaj wzór nr 1 dla zmiennych z tablicy $tab
  5. wzor2($tab2); // -> zapodaj wzór nr 2 dla zmiennych z tablicy $tab2
  6. ?>
Jifer
no i kolejny..... powaga myślicie, że na takie rozwiązanie bym nie wpadł? smile.gif

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ę: haha.gif
  1. <?php
  2. function wzor($tab,$id){
  3.    $wzor[1] = ....;
  4.    $wzor[2] = ....;
  5.    ...
  6.    return $wzor[$id];
  7. }
  8. ?>

ale wtedy przy każdym wywołaniu funkcji realizowane są wszystkie wzory, z czego jeden jest zwracany. Chyba tez kiepski pomysł. tongue.gif
melkorm
Nie rozumiem, jak chcesz wywołać coś czego nie napisałeś ? tongue.gif Skoro masz 180 wzorów to musisz je napisać, z nikąd się nie wezmą, a wywoływanie ... bo chyba pomysłu nie czaje tongue.gif

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
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 winksmiley.jpg

Zawsze możesz zrobić coś w stylu:
  1. <?php
  2. $w[0] = '3 * $zmienne['0'] + 14';
  3. $w[1] = '18 * $zmienne['5'] - 8';
  4.  
  5. echo eval($w[$numer_wzoru]);
  6. ?>

eval()" title="Zobacz w manualu PHP" target="_manual
Jifer
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
Kolega naprowadził na rozwiązanie z eval().


  1. <?php
  2. $wzor_1 = '10*$dane[0]-$dane[1]';
  3.  
  4. $wzor_2 = '5-$dane[0]/2';
  5.  
  6. $dane = array(12,55);
  7.  
  8. eval('$wynik = '.$wzor_1.';');
  9.  
  10. echo $wynik;
  11. ?>


Nie testowałem, ale powinno działać...
Jifer
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
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
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_php

co 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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.