Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z pętlami
Forum PHP.pl > Forum > PHP
Apo
Witam
Mam problem ;] No więc mam takie pętle:

  1. <?php
  2. while($array = $this -> db -> fetch_row())
  3. {
  4. foreach($nazwy as $plik)
  5. {
  6. if($array['modul'] != $plik)
  7. {
  8. $this-> db -> query( "INSERT INTO config (modul, stan) VALUES ('$plik', 'off')" );
  9. }
  10. }
  11. }
  12. ?>

No i:
$nazwy jest to tablica która zawiera nazwy plików.
$db - obiekt klasy do obsługi bazy

I chce mieć następujący efekt. Pętlą while robie tablice pól z bazy. Następnie pętlą foreach odczytuje pliki zapisane w tablicy $nazwy i jeśli w bazie nie ma pola o nazwie $plik to powinien mi go dopisać do bazy. Ale przez tą pętle (tak myśle) foreach w pętli while zapisują mi sie wszystkie pliku z tej tablicy. Jak moge to rozwiązac. Z góry thx
Ociu
in_array lub array_key_exists
Apo
Cytat
in_array lub array_key_exists

Tak sprawdzić jest łatwiej ale co z tym:
  1. <?php
  2.  $this-> db -> query( "INSERT INTO config (modul, stan) VALUES ('$plik', 'off')" );
  3. ?>
(chodzi o $plik) jak to wyciągnąc z tablicy $nazwy (tablica wygląda tak
0 => 'index.php', 2 => 'temp.php itd :?:
crash
No przecież wyciągasz to foreach()'em
Apo
Cytat
Ale przez tą pętle (tak myśle) foreach w pętli while zapisują mi sie wszystkie pliku z tej tablicy.

A nie da sie tego połączyć to foreach z tym while ?
Ociu
  1. <?php
  2. while($array = $this -> db -> fetch_row())
  3. {
  4.  
  5. if(in_array($array['modul'], $nazwy))
  6. {
  7. $this-> db -> query( "INSERT INTO config (modul, stan) VALUES ('".$array['modul']."', 'off')" );
  8. }
  9.  
  10. }
  11. ?>
Apo
heh
Właśnie chodzi mi o to żeby dodać do bazy rekord którego nie ma w bazie danych, a który jest w tablicy $nazwy i w tym jest cały problem ;/

Czyli po ludzkiemu kod by był taki tongue.gif
Pętla robi zapytanie do tablicy $array. Następnie są poruwnywane wartosci z array[1] i z tablicą $nazwy. Jeśli tablica $nazwy zawieta taki element którego nie ma tablica $array to jest on dodawany do bazy.
Ociu
Wiesz co to jest negacja ?
!in_array()
Apo
nie zrozumiałeś mnie @Ociu
bo jak zrobie tak jak mówisz:
  1. <?php
  2. while($array = $this -> db -> fetch_row())
  3.     {
  4.             if(!in_array($array['modul'], $nazwy)
  5.             {
  6.             $this-> db -> query( "INSERT INTO config (modul, stan) VALUES ('$nazwy', 'off')" ); //// <----- o tu
  7.             }
  8.     }
  9. ?>

To przecież ta zmienna $nazwy jest tablica i doda mi to bazy danych napis Array. A nie brakujący plik którego nie ma w bazie a jest w katalogu. Bo ten skrypt obsługuje moduły.
chomiczek
Miałe kiedyś podobny problem i już Ci mówie jak go rozwiązać, a raczej napisze Ci fragment mojego kodu.. sądze, że zakumasz o co w nim chodzi biggrin.gif

na początek.. mamy 2 tablice:
$aktualne[] oraz $zalecane[]


Tak je tworze:
  1. <?php
  2. $zap = "SELECT * FROM `nazwaTABELI1` WHERE `KategorieId`='".$prod['KategoriaId']."' AND `Grupa`!='' ORDER BY `Grupa`,`NowyParametr` LIMIT 100";
  3. $wyn=mysql_query($zap);
  4. $zalecane = array();
  5. while($grupa=mysql_fetch_array($wyn)) $zalecane[$grupa['NowyParametr']] = $grupa['Grupa'];
  6. $quest = "SELECT * FROM `nazwaTABELI2` WHERE `CID`='".$prod['CID']."' ORDER BY `Wartosc_MAX`,`Nazwa` LIMIT 100";
  7. $answer=mysql_query($quest);
  8. $aktualne= array();
  9. while($param=mysql_fetch_array($answer)) $aktualne[$param['Nazwa']] = $param['Wartosc_TXT'];
  10. ?>


Potem je porównuje i w przypadku jeśli nie ma jednej wartości to wyświetlam brak danych.. u Ciebie w tym miejscu będzie włożenie tego do bazy. O to całe porównanie:

  1. foreach($zalecane as $nazwa=>$kategoria) {
  2. $pisz = "";
  3. if ($wypisana!=$kategoria) { ?>
  4. <tr><td colspan="2"><p align=left class="napiscena_duza"><?php echo substr($kategoria,2); ?></p></td></tr>
  5. <?php $wypisana = $kategoria;
  6. }
  7. if($i++%2) $kl="parzyste"; else $kl="niep"; 
  8. if (array_key_exists($nazwa, $aktualne)) {
  9. foreach($aktualne as $aktNaz=>$aktTXT) {
  10. if ($nazwa==$aktNaz) $pisz = $aktTXT; 
  11. }
  12. }
  13. else $pisz = '<span style="color:#ccc; font-size:10px;">BRAK DANYCH</span>'; ?>
  14. <?php 
  15. $pisz = str_replace(" <li> ","<br/>&bull; ", $pisz);
  16. $pisz = str_replace("<li> ","&bull; ", $pisz);
  17. ?>
  18.  <tr class="<?php echo $kl; ?>" valign="top"><td>&nbsp;<?php echo $nazwa; ?></td><td><?php echo $pisz; ?></td></tr>
  19. <?php }


Wrzuciłem prost z pliku, więc są tam jakieś style, ale sądze, że je zrozumiesz.. w każdym razie najważniejsza jest funkcja array_key_exists.
Jedynie zastrzeżenie jest takie, że nazwy nie mogą się powtarzać. Bo wtedy się nadpiszą.. U mnie to jest tak, że w bazie w jednej tabeli mam domyslne parametry dla jakiejś kategorii (parametry, któe muszą wystąpić), a w innej tabeli mam wartości przypisane do konkretnego produktu.. w chwili przeszukiwania tablicy jesli nie znajdzie takich wartości pisze brak danych.. (chyba trochę niamieszałem z tym opisem, ale mam nadzieję, że Ci pomogłem)

A jak to działa w praktyce możesz zobaczyć na www.promediapc.pl w szczegółach jakiegoś produkt.
Ociu
Cytat
  1. <?php
  2. while($array = $this -> db -> fetch_row())
  3. {
  4.  
  5. if(in_array($array['modul'], $nazwy))
  6. {
  7. $this-> db -> query( "INSERT INTO config (modul, stan) VALUES ('".$array['modul']."', 'off')" );
  8. }
  9.  
  10. }
  11. ?>


Zobacz co napisałem. Przecieżś widać, że dodaje $array['modul']
Apo
@Ociu
$array['modul'] to nazwy modułów które są w bazie danych juz. Czyli nie moge tego dodać w taki sposów. Tylko skrypt listuje katalog gdzie znajdują się moduły i dodaje je do tablicy $nazwy. A POTEM SKRYPT SPRAWDZA KTÓREJ WARTOSCI Z TABLICY $nazwy NIE MA W BAZIE DANYCH ($array['modul']) i JEŚLI NIE MA TAKIEJ WARTOŚCI BAZA DANYCH TO JEST ONA DODAWANA Z TABLICY $nazwy.
Bo tablica $array['moduly'] zawiera odczytane nazwy modułów z BAZY DANYCH.
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.