Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Losowe wywoływanie tekstu
Forum PHP.pl > Forum > Przedszkole
D3vilroot
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
MagnuM
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.
D3vilroot
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. ?>
mike
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.
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.