Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] pętla foreach wyświetla tylko pierwszy rekord
Forum PHP.pl > Forum > Przedszkole
barblask
Pierwszy post więc witam wszystkich forumowiczów.

skrypt działać ma tak:
Pobieram dane z pliku
zapisuję każdy wiersz do tablicy
filtruje linie które mają być wyświetlanie
po pierwszej linii daje enter
zapisuję całość do pliku (dla wygody wstępnie samo echo)

W ten sposób działa wyświetlenie na stronie w/w skryptu:
  1. $lines = file ( 'art/wiersz.txt' );
  2. foreach ( $lines as $number => $line ) {
  3. $akapit[0] = '15';
  4. $akapit[1] = '20';
  5. $akapit[2] = '28';
  6. $akapit[3] = '33';
  7. $akapit[4] = '38';
  8. $akapit[5] = '43';
  9. $wersy = $akapit[5];//$akapit[rand (5,5)];
  10. if ( $number >= 1 AND
  11. $number <= $wersy AND
  12. $number != 22 AND
  13. $number != 23 AND
  14. $number != 24 ) {
  15. echo($line);
  16. if ( ( $number == 1 ) ){
  17. echo("\n");
  18. }
  19. }
  20. }


jednak gdy wyświetlam całość takim kodem pokazuje mi się tylko pierwsza linia. Proszę o wytłumaczenie mi gdzie robię błąd.
  1. function pliczek(){
  2. $lines = file ( 'pierwszy.txt' );
  3. foreach ( $lines as $number => $line ) {
  4. /*$akapit[0] = '15';
  5.   $akapit[1] = '20';
  6.   $akapit[2] = '28';
  7.   $akapit[3] = '33';
  8.   $akapit[4] = '38';*/
  9. $akapit[5] = '43';
  10. $wersy = $akapit[5];//$akapit[rand (0,5)];
  11. if ( $number >= 1 AND
  12. $number <= $wersy AND
  13. $number != 22 AND
  14. $number != 23 AND
  15. $number != 24 ) {
  16. return($line);
  17. if ( ( $number == 1 ) ){
  18. return("\n");
  19. }
  20. }
  21. }
  22. }
  23.  
  24. $drugitxt = pliczek('text');
  25. echo $drugitxt; //docelowo zapis do pliku zamiast echa
evolucja
No bo dochodzi do linijki z 'return', funkcja wysyła wynik i się kończy nie idąc dalej.
  1. function pliczek(){
  2. $lines = file ( 'pierwszy.txt' );
  3. foreach ( $lines as $number => $line ) {
  4. /*$akapit[0] = '15';
  5.   $akapit[1] = '20';
  6.   $akapit[2] = '28';
  7.   $akapit[3] = '33';
  8.   $akapit[4] = '38';*/
  9. $akapit[5] = '43';
  10. $wersy = $akapit[5];//$akapit[rand (0,5)];
  11. if ( $number >= 1 AND
  12. $number <= $wersy AND
  13. $number != 22 AND
  14. $number != 23 AND
  15. $number != 24 ) {
  16. $ob .= $line;
  17. if ( ( $number == 1 ) ){
  18. $ob .= "\n";
  19. }
  20. }
  21. return $ob;
  22. }
  23. }
  24.  
  25. $drugitxt = pliczek('text');
  26. echo $drugitxt; //docelowo zapis do pliku zamiast echa

Po za tym, dlaczego deklarujesz zmienne $akapit wewnętrz pętli foreach, tym samym deklarując je niepotrzebnie tyle razy ile jest linijek w pliku?
barblask
Dziękuję za szybka odpowiedz. Niestety nie pomogło. Tym razem nic się nie wyświetla.
bastard13
Dodaj sobie na początku skryptu error_reporting(E_ALL) i napisz czy ci coś wyrzuca.
A poza tym dlaczego deklarujesz funkcję tak:
  1. function pliczek(){ /*...*/ }

A wywołujesz ją z argumentem:
  1. $drugitxt = pliczek('text');
barblask
  1. <?php
  2. echo '<pre>';
  3. function pliczek(){
  4. $lines = file ( 'art/wiersz.txt' );
  5. /*$akapit[0] = '15';
  6. $akapit[1] = '20';
  7. $akapit[2] = '28';
  8. $akapit[3] = '33';
  9. $akapit[4] = '38';*/
  10. $akapit[5] = '44';
  11. $wersy = $akapit[5]; //$akapit[rand (0,5)];
  12. foreach ( $lines as $number => $line ) {
  13. if ( $number >= 0 AND
  14. $number <= $wersy AND
  15. $number != 22 AND
  16. $number != 23 AND
  17. $number != 24 ) {
  18. $ob .= $line;
  19. if ( ( $number == 1 ) ){
  20. $ob .= "\n";
  21. }
  22. }
  23. return $ob;
  24. }
  25. }
  26.  
  27. $drugitxt = pliczek();
  28. echo $drugitxt; //docelowo zapis do pliku zamiast echa
  29. ?>

Z tym kodem dostaje:
  1. <pre><br />
  2. <b>Notice</b>: Undefined variable: ob in <b>C:\apache\htdocs\www9\arttxt.php</b> on line <b>19</b><br />
  3.  
bastard13
dodaj na początku funkcji:
  1. function pliczek(){
  2. $ob='';
  3. $lines = file ( 'art/wiersz.txt' );
barblask
tym razem nic sie nie wyświetla, w źródle tylko <pre>
  1. echo '<pre>';
  2. function pliczek(){
  3. $ob='';
  4. $lines = file ( 'art/wiersz.txt' );
  5. $wersy = 44;
  6. foreach ( $lines as $number => $line ) {
  7. if ( $number >= 1 AND
  8. $number <= $wersy AND
  9. $number != 22 AND
  10. $number != 23 AND
  11. $number != 24) {
  12. $ob = $line;
  13. if ( ( $number == 1 ) ){
  14. $ob = $line."\n";
  15. }
  16. }
  17. return $ob; //przy echo $ob wyświetla się ale nie mogę później tego wywołać
  18. }
  19. }
  20.  
  21. $drugitxt = pliczek();
  22. echo $drugitxt; //docelowo zapis do pliku zamiast echa
bastard13
Nadpisujesz w foreach zmienną $ob, a nie dodajesz do niej kolejnej linii. Przed znakiem '=' dodaj '.' (kropka) i będzie dodawało, a nie nadpisywało zmienną.
barblask
  1. //...
  2. $ob.= $line;
  3. //...
  4. $ob.=$line."\n";
  5. //...

To też nic nie wyświetla.
bastard13
A jak wywalisz if'y i w foreach dasz:
  1. foreach ( $lines as $number => $line ) {
  2. $ob .= $number.'. '.$line.'<br>';
  3. }

czy wyświetla ci linie?
barblask
linie nr
0.
No tak, pierwsza jest pusta w pliku. Czyli wyświetla tylko pierwszą.
bastard13
to zamień foreach na for($i=0;$i<count($lines);$++) i powinno zadziałać.
barblask
  1. <?php
  2. echo '<pre>';
  3. function pliczek(){
  4. $ob = '';
  5. $lines = file ( 'art/wiersz.txt' );
  6. for($i=0;$i<count($lines);$++) {
  7. $ob .= $number.'. '.$line.'<br>';
  8. return $ob;
  9. }
  10. }
  11.  
  12. $drugitxt = pliczek();
  13. echo $drugitxt; //docelowo zapis do pliku zamiast echa
  14. ?>

W ten sposób? Coś mi się tu kupy nie trzyma albo się już pogubiłem. W każdym bądź razie:

Kod
Parse error: syntax error, unexpected T_INC, expecting T_VARIABLE or '$' in C:\apache\htdocs\www9\arttxt.php on line 7
Wicepsik
Nigdy nie używałeś pętli for ? Spojrzyj jeszcze raz na kod i zobacz czego brakuje. Forum to nie parser :|
bastard13
W ten sposób:
  1. function pliczek(){
  2. $ob = '';
  3. $lines = file ( 'art/wiersz.txt' );
  4. for($i=0;$i<count($lines);$i++) {
  5. $ob .= $i.'. '.$lines[$i].'<br>';
  6. }
  7. return $ob;
  8. }

Błąd ci wyrzuca, bo w for nie było ostatniego i przy dolarze. Poza tym nie masz teraz zmiennych $line i $number, bo nie rozbijasz tablicy foreach'em. I return powinien być za pętlą for.
barblask
tja... sory.
Teraz widzę, spora droga jeszcze prze de mną winksmiley.jpg
Wielkie dzięki @bastard13
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.