Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] formatowanie odpowiedzi funkcji exec()
Forum PHP.pl > Forum > Przedszkole
Sebaa
Witam
Mam na stronie następujący skrypt wypisujący na ekranie kilka linijek odpowiedzi dowolnej komendy powłoki Linux.
exec("polecenie",$wyj);
for ($i=0; $i < count($wyj); $i++) {print($wyj[$i]."\n");};
Zakładając, że odpowiedź ma 5 linijek. Czy mógłbym jakoś nie wyświetlać na przykład 4tej linijki?.
Proszę o pomoc.
Void
  1. exec("polecenie",$wyj);
  2.  
  3. for ($i=0; $i < count($wyj); $i++) {
  4. if ($i != 3) {
  5. print($wyj[$i]."\n");
  6. }
  7. }

? smile.gif
Sebaa
ehhh .. rzeczywiście proste smile.gif
Dziękuję. smile.gif
CyberDuck_
Robicie jeden podstawowy blad i jeszcze tego nie zauwazacie na stronie.

Przypuscmy, ze masz te swoja tablice zbudowana tak :
  1. $wyj[0] = 'tekst 1';
  2. $wyj[1] = 'tekst 2';
  3. $wyj[2] = 'tekst 3';
  4. $wyj[3] = 'tekst 4';
  5. $wyj[4] = 'tekst 5';

Czyli masz 5 komorek w tabeli tak ?
Teraz robiac tak :
  1. for ($i=0; $i < count($wyj); $i++) {

kazesz skryptowi wyswietlic tak na prawde 6 komorek bo count zwraca Ci
liczbe 5, a Ty robisz petle od 0 wiec wyswietlasz komorki 0, 1, 2, 3, 4, 5 .
Liczac od poczatku wychodzi 6 komorek.
Nie lepiej zrobic tak ? :
  1. for ($i=0; $i < (count($wyj) - 1); $i++) {
Fifi209
Robiąc tak jak mówisz, ominiesz ostatni element tablicy.
Void
Cytat(CyberDuck_ @ 22.09.2009, 01:54:34 ) *
Robicie jeden podstawowy blad i jeszcze tego nie zauwazacie na stronie.

Lepiej pomyśl chwilę kolego zanim wytkniesz komuś błąd smile.gif

count zwraca całkowitą liczbę elementów w tablicy, a nie ostatni index, więc dla takiej tablicy jaką podałeś:
  1. $wyj[0] = 'tekst 1';
  2. $wyj[1] = 'tekst 2';
  3. $wyj[2] = 'tekst 3';
  4. $wyj[3] = 'tekst 4';
  5. $wyj[4] = 'tekst 5';

count($wyj) będzie równe 5.

W warunku sprawdzamy, licząc od 0, czy $i jest mniejsze od count($wyj) (mniejsze, nie mniejsze lub równe). Więc wszystko będzie w porządku, warunek będzie spełniony dla 0, 1, 2, 3, 4 (dla 5 już nie bo 5 nie jest mniejsze od 5).

Cytat(CyberDuck_ @ 22.09.2009, 01:54:34 ) *
Nie lepiej zrobic tak ? :
  1. for ($i=0; $i < (count($wyj) - 1); $i++) {

Nie, nie lepiej bo wtedy nie wypiszesz ostatniego elementu tablicy.
count($wyj) - 1 = 4, warunek jest spełniony dla 0, 1, 2, 3 (a gdzie czwarty element tablicy?).
Jeżeli już to musiał byś dać tak:
  1. for ($i=0; $i <= (count($wyj) - 1); $i++) {
Fifi209
~Void
A jak tym drugim sposobem z odejmowaniem od count wytniesz coś ze środka?

W ogóle nie prościej wywalić ten element?
unset + przelecieć foreach
Void
Cytat(fifi209 @ 22.09.2009, 08:01:39 ) *
~Void
A jak tym drugim sposobem z odejmowaniem od count wytniesz coś ze środka?

Tak jak tamtym, tylko trzeba by dodać w ifie 1 do indeksu tablicy tongue.gif Ale wiem, to bez sensu, zresztą teraz nie myślałem akurat o problemie z tematu tylko chciałem wyjasnić ~CyberDuck_ kiedy może użyć tej swojej metody smile.gif
CyberDuck_
fifi ja nie pisalem o metodzie. Tylko przesledzcie to co napisalem.
Metode juz ktos tutaj podal. Zreszta jak juz wspomnial moj poprzednik
tez blednie bo trzeba od oidjac tez jeden. Indexowanie tablicy zaczyna
sie od zeraPomysl z forech chyba jest nawet lepszy.
Podalem konkretny przyklad i zaden element nie zostanie
pominiety jak ktos tu zauwazyl . Przesledz kolego dokladnie
dzialanie i zobaczysz, ze wszystkie elementy zostana wziete pod
uwage, jesli oczywiscie jak bozia przykazala bedziesz zapisywac
elementy w tablicy od indexu=0 w zwyz.

Zreszta na zdrowy rozum i logicznie rozumujac.
Powtorze sie, ale co mi tam ...
0 - element 1
1 - element 2
2 - element 3

teraz wykonujesz count i dostajesz wynik 3
wykonujac petle :
  1. for ($licznik = 0; $licznik <= count($tablica); $licznik++) {

wykonujesz ja 4 razy exclamation.gif bo zaczynasz od zera i konczysz na 4 ...
Czyli 0, 1, 2, 3 ... Tu sa 4 elementy a w tablicy zapamietales 3 wiec
o jeden wyswietlasz wiecej ... Stad to moje
  1. (count($tablica) - 1);

Najlepiej to jest przesledzic na przykladzie najprostszym jaki moze byc
wiec dla leniwych prosze bardzo do skopiowania i wklejenia do edytorka:
  1. <?php
  2. $tab[0] = '1';
  3. $tab[1] = '2';
  4. $tab[2] = '3';
  5. $tab[3] = '4';
  6. $tab[4] = '5';
  7. for ($licznik = 0; $licznik <= (count($tab) -1); $licznik++) {
  8. echo $licznik .":" .$tab[$licznik] ."<br>";
  9. }
  10. ?>

Wynik :
  1. 0:1
  2. 1:2
  3. 2:3
  4. 3:4
  5. 4:5

I jest wyswietlana prawidlowa ilosc elementow, a jakby nie bylo -1 ?
  1. <?php
  2. $tab[0] = '1';
  3. $tab[1] = '2';
  4. $tab[2] = '3';
  5. $tab[3] = '4';
  6. $tab[4] = '5';
  7. for ($licznik = 0; $licznik <= count($tab); $licznik++) {
  8. echo $licznik .":" .$tab[$licznik] ."<br>";
  9. }
  10. ?>

wynik :
  1. 0:1
  2. 1:2
  3. 2:3
  4. 3:4
  5. 4:5
  6. 5:

Dlaczego pisze jak bozia przykazala ?
Wystarczy usunac index z tablicy ...
  1. $tab[] = '1';
  2. $tab[] = '2';
  3. $tab[] = '3';
  4. $tab[] = '4';
  5. $tab[] = '5';

Efekt za kazdym razem bedzie taki sam.
Powodzonka.
Void
Cytat(CyberDuck_ @ 22.09.2009, 09:35:33 ) *
Zreszta na zdrowy rozum i logicznie rozumujac.
Powtorze sie, ale co mi tam ...
0 - element 1
1 - element 2
2 - element 3

teraz wykonujesz count i dostajesz wynik 3
wykonujac petle :
  1. for ($licznik = 0; $licznik <= count($tablica); $licznik++) {

wykonujesz ja 4 razy exclamation.gif bo zaczynasz od zera i konczysz na 4 ...
Czyli 0, 1, 2, 3 ... Tu sa 4 elementy a w tablicy zapamietales 3 wiec
o jeden wyswietlasz wiecej ... Stad to moje
  1. (count($tablica) - 1);

Najlepiej to jest


No tak, tu masz rację, tylko wróć do swojego poprzedniego posta i sprawdź czy na pewno tak samo napisałeś tongue.gif

Cytat(CyberDuck_ @ 22.09.2009, 01:54:34 ) *
Nie lepiej zrobic tak ? :
  1. for ($i=0; $i < (count($wyj) - 1); $i++) {


Odjąłeś 1 od wartości count(), ale przy tym użyłeś w warunku znaku < a nie <=.
W tym przypadku mając 4-elementową tablicę byłoby tak:
indeksy tablicy: 0, 1, 2, 3
count(tablica) = 4
count(tablica)-1 = 3
warunek: $i < (count(tablica) - 1) spełniony dla indeksów mniejszych od 3, czyli tylko dla elementów o indeksach 0, 1, 2. A gdzie indeks 3? smile.gif

Żeby warunek był spełniony dla wszystkich elementów trzeba postawić ten znak <= lub zostawić znak <, ale wtedy nie odejmować jedynki (wyjdzie na to samo).
CyberDuck_
Racja ...
Przepraszam. Zwykla pomylka, ale dobre, ze wiadomo
o co juz chodzi.
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.