Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyrażeniem IF
Forum PHP.pl > Forum > PHP
new_user
Mam taki kod:
  1. <?php
  2. while(!feof($plik_txt)) {
  3. $linia = fgets($plik_txt,255);
  4. if (eregi("^[a-zA-Z0-9]",$linia)) {
  5.  $rekord = split(";",$linia);
  6. if ((!eregi($rekord[0],$wiersz[0])) and (!eregi($rekord[1],$wiersz[1]))){
  7. $wiersz[2] = str_replace("=", "=OD", $wiersz[2]);
  8. $wiersz[3] = str_replace("=", "=OD", $wiersz[3]);
  9. $gen_xml .= "\t\t<row>\n";
  10. $gen_xml .= "\t\t\t<column name=\"2\">".$wiersz[2]."</column>\n";
  11. $gen_xml .= "\t\t\t<column name=\"3\">".$wiersz[3]."</column>\n";
  12. $gen_xml .= "\t\t\t<column name=\"4\">".$wiersz[4]."</column>\n";
  13. $gen_xml .= "\t\t\t<column name=\"5\">".$wiersz[5]."</column>\n";
  14. $gen_xml .= "\t\t\t<column name=\"6\">".$wiersz[6]."</column>\n";
  15. $gen_xml .= "\t\t</row>\n";
  16. }
  17. }
  18. ?>

Mam dwa takie kawałki kodu jeden z !eregi a drugi z samym eregi i ten bez ! działa bez zarzutu natomiast ten drugi z ! zwraca mi tak jakby wyniki wszystkie i te spelniające warunek i te nie spełniające warunku.
Bardzo proszę o pomoc
JoShiMa
A jak się wprowadza zaprzeczenie, to nie powinno być or zamiast and ?

Jednym słowem warunek przeciwny do takiego:
  1. <?php
  2. (eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))
  3. ?>


wygląda tak:
  1. <?php
  2. !(eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))
  3. ?>


lub tak:
  1. <?php
  2. (!eregi($rekord[0],$wiersz[0])) or (!eregi($rekord[1],$wiersz[1]))
  3. ?>


Mam nadzieję, że to jest odpowiedź na Twoje pytanie.
new_user
NIe wiem czemu ale wyniki mam inne niż powinny być.
Jak skasuje ! (wykrzyknik) przed eregi to wyniki mam poprawne a jak zastosuje negacje to niestety nie a potrzebuje wyniki odwrotne do uzyskanych bez negacji
JoShiMa
No przecież napisałam Ci jak to trzeba zrobić, żeby było odwrotnie.

  1. <?php
  2. !(p and q) <=> !p or !q
  3. ?>
new_user
Właśnie zastosowałem to co napisałeś:
  1. <?php
  2. !(eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))
  3. ?>


i teraz mam tak:
  1. <?php
  2. while(!feof($plik_txt)) {
  3. $linia = fgets($plik_txt,255);
  4. if (eregi("^[a-zA-Z0-9]",$linia)) {
  5.  $rekord = split(";",$linia);
  6. if (!(eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))){
  7. $wiersz[2] = str_replace("=", "=OD", $wiersz[2]);
  8. $wiersz[3] = str_replace("=", "=OD", $wiersz[3]);
  9. $gen_xml .= "\t\t<row>\n";
  10. $gen_xml .= "\t\t\t<column name=\"2\">".$wiersz[2]."</column>\n";
  11. $gen_xml .= "\t\t\t<column name=\"3\">".$wiersz[3]."</column>\n";
  12. $gen_xml .= "\t\t\t<column name=\"4\">".$wiersz[4]."</column>\n";
  13. $gen_xml .= "\t\t\t<column name=\"5\">".$wiersz[5]."</column>\n";
  14. $gen_xml .= "\t\t\t<column name=\"6\">".$wiersz[6]."</column>\n";
  15. $gen_xml .= "\t\t</row>\n";
  16. }
  17. }
  18. ?>


Niestety dziwne wyniki mam.
A mam taki plik TXT:
  1. 11111;
  2. 22222;

i chcialbym zeby w tej petli byly pomijane rekordy z tymi liniami, żeby były tylko wypluwane rekordy ktore nie istnieja w tym pliku.
Próbowałem nawet zrobić w taki sposób:
i teraz mam tak:
  1. <?php
  2. while(!feof($plik_txt)) {
  3. $linia = fgets($plik_txt,255);
  4. if (eregi("^[a-zA-Z0-9]",$linia)) {
  5.  $rekord = split(";",$linia);
  6. if (!($rekord[0]==$wiersz[1])){
  7. $wiersz[2] = str_replace("=", "=OD", $wiersz[2]);
  8. $wiersz[3] = str_replace("=", "=OD", $wiersz[3]);
  9. $gen_xml .= "\t\t<row>\n";
  10. $gen_xml .= "\t\t\t<column name=\"2\">".$wiersz[2]."</column>\n";
  11. $gen_xml .= "\t\t\t<column name=\"3\">".$wiersz[3]."</column>\n";
  12. $gen_xml .= "\t\t\t<column name=\"4\">".$wiersz[4]."</column>\n";
  13. $gen_xml .= "\t\t\t<column name=\"5\">".$wiersz[5]."</column>\n";
  14. $gen_xml .= "\t\t\t<column name=\"6\">".$wiersz[6]."</column>\n";
  15. $gen_xml .= "\t\t</row>\n";
  16. }
  17. }
  18. ?>

też nie pomogło i wypluwa rekordy które znajdują się w pliku.
JoShiMa
Cytat(new_user @ 4.04.2008, 10:07:58 ) *
Właśnie zastosowałem to co napisałeś:
  1. <?php
  2. !(eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))
  3. ?>


Oj bo się nie przyjrzałeś tylko kopiujesz na pałę. Zaprzeczenie ma być przed całym wyrażeniem a więc tak:
  1. <?php
  2. !((eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1])))
  3. ?>


Lub inaczej tak:

  1. <?php
  2. !(eregi($rekord[0],$wiersz[0])) or !(eregi($rekord[1],$wiersz[1]))
  3. ?>


Weź poucz się trochę o wyrażeniach logicznych.
new_user
Właśnie proboje na różne sposoby i niestety coś mi nie wychodzi (zamotałem sie i nie mogę z tego wybrnąć).
Teraz mam tak i nadal mam ten sam problem:
  1. <?php
  2. if (!((eregi($rekord[0],$wiersz[0])) and
  3. (eregi($rekord[1],$wiersz[1])))){
  4. ?>

teraz zaprzeczenie jest przed całym wyrażeniem.
JoShiMa
A jak powstaje i jakie wartości ma tablica wiersz?
new_user
Tablica wiersz ma wartosci poprawne.
Tzn w pliku txt mam takie wartosci:
parametr1;parametr2;
parametr3;parametr4;
i tablica wiersz zwraca mi poprawne:
$wiersz[0] = parametr1
$wiersz[1] = parametr2
i tak dla kazdego wiersza.
Dziwne jest to ze dla takigo warunku
if ((eregi($rekord[0],$wiersz[0])) and (eregi($rekord[1],$wiersz[1]))){
działanie skryptu jest OK ale dla takiego
if (!((eregi($rekord[0],$wiersz[0])) and(eregi($rekord[1],$wiersz[1])))){
już nie w wyniku tego warunku mam rekordy które są w pierwszym wyniku a nie powinno być ich tam.
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.