Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Losowe wywoływanie tekstu, na pliku
D3vilroot
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 5.08.2006

Ostrzeżenie: (0%)
-----


Pewnie ten kod nie jest zbyt profesjonalny, ale po części działa więc nie obrzucajcie błotem tongue.gif
Tak to wygląda
Kod
<?php

$nr1 = fopen('wpis.txt', 'r');
$nr2 = fopen('wpis2.txt', 'r');
$nr3 = fopen('wpis3.txt', 'r');
$nr4 = fopen('wpis4.txt', 'r');
$nr5 = fopen('wpis5.txt', 'r');

$tresc1 = fread($nr1, filesize("wpis.txt"));
$tresc2 = fread($nr2, filesize("wpis2.txt"));
$tresc3 = fread($nr3, filesize("wpis3.txt"));
$tresc4 = fread($nr4, filesize("wpis4.txt"));
$tresc5 = fread($nr5, filesize("wpis5.txt"));
// definujemy teksty
$text=array(
   1 => $tresc1,
   2 => $tresc2,
   3 => $tresc3,
   4 => $tresc4,
   5 => $tresc5
);


// inicjujemy generator liczb losowych
srand((double) microtime() * 10000000);

// sprawdzamy ilość tekstów w tablicy
$ile = count($text);
// losujemy liczbę
$losowa = rand(1, $ile);

// wyświetlamy tekst
echo "<br><br><br>$text[$losowa]";
?>


Chciałbym wiedzieć jak zrobić, żeby pobrany tekst z pliku posiadał znaki zakończenia linii. Bo tak wygląda troche nieładnie biggrin.gif

I teraz druga sprawa. Chce zrobić tak, że będe pobierał linie z pliku funkcją file(). Wiem, że tworzy ona tablice i 1 element tablicy to 1 linia tekstu. Jak zrobić, żeby np. 20 linii z 10 stronowego tekstu pojawiało się przypadkowo, np.
Kod
15 linia
jakiś tam mój kod
23 linia
1 linia
znowu mój kod
itd.

I żeby żadna linia się nie powtarzała? Może to głupie pytania, ale troche już szukałem i udało mi się tyle, że linie się powtarzają.
Dzięki za przeczytanie i wszelką pomoc cool.gif
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
MagnuM
post
Post #2





Grupa: Zarejestrowani
Postów: 108
Pomógł: 0
Dołączył: 7.05.2004
Skąd: Jelenia Góra

Ostrzeżenie: (0%)
-----


W moim przekonaniu ten kod jest straszny. No ale cóż.. przyałoby się żebyś wiedział właściwie dlaczego? Przyda Ci się na przyszłość ;-)

1. Otwierasz każdy plik pokolei, chociaż użyjesz tylko jednego z nich.
Prosta kwestia. Skrypt wykonywany jest strasznie długo. Co w momencie gdy plików będzie więcej?

2. Wczytujesz każdy plik do zmiennej. Bardzo długo to trwa. W przypadku większych plików zmienne zawierają straszne ilości danych, chociaż nie wiem czy to jest wada ? Zaleta na pewno nie...

3. W obecnej wersji php inicjowanie generatora liczb losowych nie jest wymagane!

Musisz wiedzieć, że php to przede wszystkim skrypty dynamiczne, a Ty nie wykorzystujesz jego możliwości.
Zdaje mi się, że to jest przypadek czytania przestarzałych, beznadziejnych kursów o php i potomych...

Więc sprawdźmy co da się tutaj zrobić ;-) O ile zaraz ktoś mnie nie wyprzedzi.

Zakładamy, że masz do dyspozycji 5 plików o charakterystycznej nazwie wpis%id (w przypadku jedynki bez %id).

  1. <?php
  2. // tablica z plikami
  3. $aFiles = array(
  4. 1 => 'wpis.txt',
  5. 2 => 'wpis2.txt',
  6. 3 => 'wpis3.txt',
  7. 4 => 'wpis4.txt',
  8. 5 => 'wpis5.txt'
  9. );
  10.  
  11. // zadeklarowanie ilości plików
  12. $iFilesCount = count( $aFiles );
  13.  
  14. // generowanie losowego pliku
  15. $iFileId = rand( 1, $iFilesCount );
  16.  
  17. // deklaracja uchwytu pliku
  18. $rFile = fopen( $aFiles[$iFileId], 'r' );
  19.  
  20. // odczyt pliku
  21. $sBody = fread( $rFile, file_size( $aFiles[$iFileId] ) );
  22.  
  23. echo $sBody;
  24. ?>


c.d.n Zaraz dopiszę reszte... tongue.gif

EDIT:

Więc teraz kwestia zamiany znaków końca linii:

Przed wyświetleniem zmiennej $sBody należy wpisać następujący kod:
  1. <?php
  2. $sBody = str_replace( array("rn", "n", "r"), "<br />", $sBody );
  3. ?>


Co do ostatniego pytania o losowe linie, to zostawiam to jako zadanie domowe... żebym nie był taki dobry ;p
Podpowiem oczywiście, że można te linie które już były wyświetlone wrzucać do tablicy
  1. <?php
  2. $aExample[] = $iLine; // doda automatycznie nowy element tablicy
  3. ?>


... a później sprawdzać przy pomocy funkcji array_key_exists() czy dany element (linia) znajduje się już w tablicy.

Ten post edytował MagnuM 5.08.2006, 21:46:37


--------------------
Go to the top of the page
+Quote Post
D3vilroot
post
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 5.08.2006

Ostrzeżenie: (0%)
-----


Właściwie to skorzystałem z gotowego skryptu znalezionego w sieci, tylko trochę go przerobiłem
tu masz adres
Losowy tekst na stronie
Może i zrobiłem to niewłaściwie tongue.gif

Ale w Twoim kodzie też malutki błąd spotkałem u mnie serwer wywalił błąd
Kod
Fatal error: Call to undefined function: file_size()

dlatego zmieniłem file_size() na filesize()
Teraz popracuje troche nad drugim zadaniem.
Dzięki za pomoc biggrin.gif


Coś udało mi się zrobić rolleyes.gif
Niewiem teraz jak zrobić żeby każda linia była inna. bo niestety nadal się powtarzają.
  1. <?php
  2. $i=1;
  3. while ($i<21)
  4. {
  5. $laduj = file('wpis.txt'); 
  6. // liczy ilosc linii w pliku
  7. $iloscLinii = count($laduj);
  8. // losuje linie
  9. $linia= rand(1, $iloscLinii);
  10. // wyswietla linie i jej numer
  11. echo "$i <b>Linia #$linia</b> ";
  12. echo "$laduj[$linia]<br>";
  13. $i++;
  14. }
  15. ?>


Ten post edytował D3vilroot 6.08.2006, 17:24:31
Go to the top of the page
+Quote Post
mike
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Dlatego że losujesz za każdym razem, przy każdym obrocie pętli.

Zrób tak:
  1. <?php
  2.  
  3. $arrFile = file( 'wpis.txt' ); // wczytujesz wszystko do tablicy
  4.  
  5. shuffle( $arrFile ); // tasujesz/mieszasz tablicę
  6.  
  7. $intLinesCount = count( $arrFile ); // liczysz ilość linii
  8.  
  9. for( $i = 0; $i < $intLinesCount; $i++ ) //tablica jest indeksowana od zera
  10. {
  11. echo $arrFile[ $i ] . '<br />';
  12. }
  13.  
  14. ?>



P.S.
Przenoszę na Przedszkole.
Przeciez to wszystko to banalne wykorzystanie podstawowych funkcji z manuala.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 21:11