Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuniecie liczb z przedzialu - pętle
Forum PHP.pl > Forum > PHP
S3baso
Witam, mam problem z pętlami, mam dane liczby od np. 7000 do 9000 petla while lub for wypisuje te liczby, to zadna roznica, ale mam tez druga petle potrzebna do wyciagniecia liczb z bazy danych

  1. for($i=0; $i<$ilosc_wierszy; $i++) {
  2. echo $r[$i];
  3. }


Wyciaga tylko tyle liczb ile jest w bazie, czyli w tym przypadku wypisze jakies liczby, zalozmy 8002, 8220, 8035, 8100 i jak te liczby "wyciagnac" usunac z tamtej petli wyliczajacej liczby od 7000 do 9000 ?
PrinceOfPersia
np. tak:
Kod
for ($j = 7000; $j <= 9000; $j++) {
  if (in_array($j, $r))
      continue;
  //---- cos rob
}


edit: poprawka, błąd w kodzie.

S3baso
hmm, ale to sa osobne 2 petle, gdzie jedna od 0 do x wypisuje raz 1 raz 4 liczby a druga stale od 7 tysiecy do 9 tys

  1. $porty=7000;
  2. $porty_koniec=9000;
  3. while ($porty != $porty_koniec + 1)
  4. {
  5. echo $porty;
  6. ++$porty;
  7. }


z tej wyrzucic liczby o te:

  1. for($i=0; $i<$ilosc_wierszy; $i++) {
  2. echo $r[$i];
  3. }
PrinceOfPersia
w moim poprzednim kodzie jest błąd - wieczna pętla, zaraz poprawię.

edit:

chyba wystarczy Ci jedna pętla:
Kod
$porty=7000;
$porty_koniec=9000;
while ($porty != $porty_koniec + 1)
{
  if (!in_array($porty, $r))
      echo $porty . "<br />";
  ++$porty;
}

zakładając, że w $r znajdują się liczby w takim formacie array(8002, 8220, 8035, 8100)
S3baso
ok, ale to nie tak ma dzialac, jak mam porownac if (in_array($j, $r)) skoro $r jest raz 1 liczba raz 100 liczb wiec musialbym po kolei porownywac $r[0], $r[1] itd. w zaleznosci od ilosci liczb, a jak mam zrobic petle w petli ?

#EDIT:

@UP zaraz to przestudiuje biggrin.gif


#EDIT2:

Jak to pobrac z mysqla w takim formacie ? Wszystkie liczby z $query = "SELECT port FROM users";

Jak pobrac wszystkie liczby z danej kolumny o nazwie port i zapisac w takim formacie?
Michael2318
Pętla z jakimiś tam liczbami, załóżmy od 0 do 9000:

  1. $count = 9000; // max. liczba ma wyniesc 9000
  2. $tablica_z_liczbami = array();
  3. for($i=0; $i<=$count; $i++)
  4. {
  5. $$tablica_z_liczbami[] = $i;
  6. }


Teraz wyciągamy jakieś tam wartości z bazy, nie wiem co to ma być więc załóżmy że wyciągamy wszystkie ID z tabeli `users`:

  1. $sql = "SELECT id FROM `users`";
  2. if ( !($result = mysql_query($sql)) )
  3. {
  4. die('error<br>'.mysql_error());
  5. }
  6. while($row = mysql_fetch_assoc($result))
  7. {
  8. $liczby_do_usuniecia[$row['id']] = $row['id'];
  9. }


W tym momencie w zmiennej (tablicy) $tablica_z_liczbami mamy wszystkie liczby od 0 do 9000 a w zmiennej (również tablicy) $liczby_do_usuniecia mamy wszystkie ID z tabeli `users`.
Pozostało nam usunąć te ID z tablicy $tablica_z_liczbami:

  1. for($i=0;$i<=count($tablica_z_liczbami); $i++)
  2. {
  3. if ( in_array($i, $liczby_do_usuniecia) )
  4. {
  5. if ( in_array($i, $tablica_z_liczbami)
  6. {
  7. unset($tablica_z_liczbami[$i];
  8. }
  9. }
  10. }
  11. print_r($tablica_z_liczbami); // powinno wyprintować wszystkie liczby z przedziału 0-9000 poza IDekami wyciągnietymi z bazy
S3baso
Hmm, bardziej chodzilo mi o liste rozwijalna czyli zapetlilem <option>xxx</option> do np. 2000 razy z roznymi liczbami, zaraz pokombinuje i zobacze czy to zda egzamin, i tak dziekuje za wlozenie w to serca biggrin.gif

To nie zda egzaminu, bo w moim przypadku w liscie rozwijalnej jest okolo 2 tysiecy elementow, petla to 3 linijki a nie 2 tysiace wpisow, z petli chce wyciagnac dane liczby, a jak wyciagnac z mysqla 4 liczby lub wiecej w zaleznosci od tego ile ich tam jest, do tego potrzebuje petli, ktora zaleznie od tego ile jest elementow wyciagnie albo 2 albo 20 liczb, tylko jak te 20 liczb (u mnie sa to numery portow) wyciagnac z tej listy rozwijalnej?

ok, namotałem to dam przykład, zebyscie mnie zrozumieli, lista rozwijalna html :

  1. <select name="port">
  2. <?php
  3. $porty=7000;
  4. $porty_koniec=9000;
  5. while ($porty != $porty_koniec + 1)
  6. {
  7. echo "<option>".$porty."</option>";
  8. ++$porty;
  9. }
  10. ?>
  11. </select>


Wyswietla w liscie liczby od 7000 do 9000, macie tu przyklad to tak wyglada: http://24shoutcast.pl/test.php i jak z tej listy liczb od 7000 do 9000 wyciagnac liczby pobrane z bazy np. 8130, 8035 itd.
Michael2318
  1. <select name="port">
  2. <?php
  3. $porty=7000;
  4. $porty_koniec=9000;
  5. while ($porty != $porty_koniec + 1)
  6. {
  7. echo "<option>".$porty."</option>";
  8. $tablica[$porty] = $porty;
  9. ++$porty;
  10. }
  11. ?>
  12. </select>
  13. <?php
  14. $sql = "SELECT id FROM `jakas_tabela`";
  15. if ( !($result = mysql_query($sql)) )
  16. {
  17. die('error in sql<br>'.mysql_error());
  18. }
  19. while($row=mysql_fetch_assoc($result))
  20. {
  21. if ( in_array($row['id'], $tablica)
  22. {
  23. unset($tablica[$row['id']);
  24. }
  25. }
  26. print_r($tablica);
PrinceOfPersia
Cytat
Hmm, bardziej chodzilo mi o liste rozwijalna czyli zapetlilem <option>xxx</option> do np. 2000 razy z roznymi liczbami

znowu... nadgorliwi ludzie wink.gif (odnośnie innego tematu, gdzie też bardzo na podobny i zacny pomysł ktoś wpadł sprawdzania hurtem milionów numerów gadu-gadu czy są botami i wrzucania tego do pliku).

A czy nie możesz po prostu dać <input type="text" /> i dopiero jak ktoś wprowadzi numer portu, to to sprawdzić ten jeden konkretny numer?
S3baso
Gdybym mógł tak zrobić to zrobiłbym to dawno i sam, bo to nie problem, z tym jest gorzej...

Michael, dziekuje za Twoj kod wszystko pieknie dziala, bylo pare bledow, ale mam teraz kolejny problem, wyrzuca te porty, ale zostawia puste pole, jak zrobic by skrypt, znaczy petla while przeskoczyla jakby to puste miejsce, bo mam narazie http://24shoutcast.pl/test.php i zobacz np. w miejscu gdzie powinno byc 8002 jest puste pole, jest juz lepiej ale jak calkiem wyrzucic to nawet puste miejsce i po 8001 od razu 8003 ?
Michael2318
Załącz mi obecny kod, będzie mi łatwiej, a zarazem też Tobie będzie prościej bo nie będziesz musiał podpinać moich wypocin pod swój kod wink.gif
S3baso
Sie nie zdziw, to jest syf jakich malo, ale Twoj kod nie dzialal, wiec zrobilem to na 3 petle hahah :

  1. <?php
  2. require "config.php";
  3. connection();
  4. $porty=7000;
  5. $porty_koniec=9000;
  6. while ($porty != $porty_koniec + 1)
  7. {
  8. $tablica[$porty] = $porty;
  9. ++$porty;
  10. }
  11.  
  12. $sql = "SELECT `port` FROM `users`";
  13. if ( !($result = mysql_query($sql)) )
  14. {
  15. die('error in sql');
  16. }
  17. while($row=mysql_fetch_assoc($result))
  18. {
  19. if (in_array($row['port'],$tablica))
  20. {
  21. unset($tablica[$row['port']]);
  22. }
  23. }
  24. //print_r($tablica);
  25. //echo $tablica[8002];
  26. ?>
  27.  
  28. <select name="port">
  29. <?php
  30. $j=7000;
  31. $jestes=9000;
  32. while ($j != $jestes + 1)
  33. {
  34. if (in_array($row['port'],$tablica))
  35. continue;
  36.  
  37. echo "<option>".$tablica[$j]."</option>";
  38. ++$j;
  39. }
  40. ?>
  41. </select>
Michael2318
Nie będę ukrywał, że teraz to mało z tego kodu rozumiem, ale takie niezbyt wyszukane rozwiązanie:

  1. while ($j != $jestes + 1)
  2. {
  3. if (in_array($row['port'],$tablica))
  4. continue;
  5.  
  6. if ( $tablica[$j] !== '' )
  7. {
  8. echo "<option>".$tablica[$j]."</option>";
  9. }
  10. ++$j;
  11. }


Chodzi o warunek:

  1. if ( $tablica[$j] !== '' )
  2. {
  3. echo "<option>".$tablica[$j]."</option>";
  4. }


który spowoduje, że doda Ci option'a tylko wtedy, gdy zmienna z tablicą nie będzie pusta. Może ktoś da Ci lepsze rozwiązanie.
S3baso
Ok, dziekuje uprzejmie, zrobilem taki syf poniewaz to co Ty dales, nie dzialalo bo nie robilo optionow jak nalezy, nie mam pojecia dlaczego, teraz jest ok i nie if ( $tablica[$j] !== '' ) tylko if ( $tablica[$j] != '' ), dziekuje, jezeli chcesz jeszcze pomoc uporzadkowac ten kod bylbym wdzieczny

#EDIT

Twoj kod bez zmian z malymi poprawkami bo zapominales np. ) lub ] wyglada tak:

http://24shoutcast.pl/test2.php
Michael2318
Cytat
i nie if ( $tablica[$j] !== '' ) tylko if ( $tablica[$j] != '' )


Pierwsze słysze, aby to miało jakiekolwiek znaczenie... wink.gif

Co do ogarnięcia kodu to niestety nadal do końca nie wiem co to w ogóle jest, ale 3 pętle to przesada, idealnie byłoby wymyślić jakiś nowy sposób/algorytm, może zaangazować bazę danych, tak aby maksymalnie to uprosicić i odciążyć serwer.
Tak jak pisałem - nie wiem do czego Ci to jest potrzebne,więc ode mnie tyle, spróbuj wymyślić coś sam i ewentualnie pytaj tutaj na forum smile.gif
S3baso
Ok rozumiem, tak zrobie i tak dziekuje za pomoc, no ja tez pierwszy raz slysze, ale !== nie dziala a jak zmienilem na != to juz tak, sam wymyslilem wlasnie sposob z 3 petlami(ktory jest beznadziejny) ale pomysle jeszcze nad tym i najwyzej podziele sie swoim rozwiazaniem biggrin.gif Jeszcze raz dziekuje
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.