Skocz do zawartości

[PHP] Funkcja losowanie


FXweb

Rekomendowane odpowiedzi

Najprościej to jest dać do działu zlecenia, bo sama funkcja explode nic w tym wypadku oczywiście NIE DAJE :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Najprościej to jest dać do działu zlecenia, bo sama funkcja explode nic w tym wypadku oczywiście NIE DAJE

:/ czy jest na sali moderator?

<?
$text='tekst z {synonimami|wyrazami bliskoznacznymi|zamiennikami} do {wylosowania|zamiany}';
function  wylosuj($do_podmiany)
{
$fraza=explode('|',$do_podmiany[1]);
return $fraza[array_rand($fraza)];
}
echo preg_replace_callback('/\{(.*?)\}/',wylosuj,$text);
?>

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Trotyl wielkie dzięki działa, a jeszcze małe pytanie,

dałoby radę to zamknąć w jednej funkcji?

Próbowałem, ale nie wychodzi mi, nie rozumiem,

dlaczego gdy używamy funkcji wylosuj nie podajemy parametru.

Czyli czemu nie ma np. wylosuj($text)

Odnośnik do komentarza
Udostępnij na innych stronach

@Lesiu nie wiem czy chodziło ci o coś takiego ale możesz sobie zagnieżdżać w nieskończoność:

<?
$text='tekst z {synonimami|{wyrazami bliskoznacznymi|zamiennikami}} do {wylosowania|{zamiany|podmiany}}';
function  wylosuj($do_podmiany)
{
$fraza=explode('|',$do_podmiany[1]);
return $fraza[array_rand($fraza)];
}
while(stristr($text,'{')) // tutaj przydało by się lepsze sprawdzanie tekstu (poprawności zagnieżdzeń) *
{
$text=preg_replace_callback('/{([^\{\}]*?)}/',wylosuj,$text);
}
echo $text;
?>

@FXweb na tym polega dzianie funkcji zwrotnej, preg_replace_callback przyjmuje jako jeden z argumentów funkcje i do niej w trakcie dziania wysyła parametr i pobiera wynik dynamicznie w trakcie pracy nad tekstem ... jakoś tak :tancze:

Możesz tak zrobić ale nie wiem po co ci to:

<?
function  wylosuj($do_podmiany)
{
$fraza=explode('|',$do_podmiany[1]);
return $fraza[array_rand($fraza)];
}
function synonimuj($text)
{
return preg_replace_callback('/\{(.*?)\}/',wylosuj,$text);
}



$text='tekst z {synonimami|wyrazami bliskoznacznymi|zamiennikami} do {wylosowania|zamiany}';
echo synonimuj($text);
?>

e: *) np.:

<?
$text='tekst z {synonimami|{wyrazami bliskoznacznymi|zamiennikami}} do {wylosowania|{zamiany|podmiany}}';
function  wylosuj($do_podmiany)
{
$fraza=explode('|',$do_podmiany[1]);
return $fraza[array_rand($fraza)];
}

if(substr_count($text,'{')==substr_count($text,'}') && $text!=null)
{
while(strstr($text,'{'))
{
$text=preg_replace_callback('/{([^\{\}]*?)}/',wylosuj,$text);
}
echo $text;
}
else
{
echo 'podany tekst jest nieprawidłowy';
}
?>

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Tak, yavaho. W świecie komputerów można mówić co najwyżej o pseudolosowości. Algorytmy "losujące" muszą się opierać na jakimś zewnętrznym - maksymalnie przypadkowym - źródle danych (np. na aktualnym czasie, pozycji kursora na ekranie, itp.). Często sprawdzana jest aktualna milisekunda, która staje się podstawą dla jakiegoś działania matematycznego.

Problem w tym, że jeśli twój algorytm jest wykonywano zbyt szybko, to jesteś w stanie dostać "pod rząd" kilka razy tą samą "losową" liczbę. Nie wiem czy ten problem akurat trapi funkcję array_rand w PHP, ale u mnie generuje jakieś mocno podejrzane wyniki.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności