Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]pętla w tablicy
Forum PHP.pl > Forum > Przedszkole
apkc
Witam! Mam takie pytanko.
Wysyłam dane formularzem, a dokładnie za pomocą zmiennej $nr_kj wysyłam kilka liczb
np:

  1. $nr_kj=1
  2. $nr_kj=4
  3. $nr_kj=6
  4. $nr_kj=12


i teraz tak:
nie wiem ile jest tych zmiennych i nie znam ich wartości przed wysłaniem.
Więc muszę zastosować pętlę która wypisze mi same te wartości w takiej formie

  1. array(1,4,6,12,)


Jak ma poprawnie wyglądać ta pętla?
darko
Jeśli dobrze zrozumiałem, to:
  1. $a = array();
  2. foreach($_POST['nr_kj'] as $p) {
  3. $a[] = $p;
  4. }
apkc
Chyba to i dobrze tylko chyba ja popełniłem błąd ponieważ za pomocą jednej zmiennej np $nr_kj za jednym razen próbuję wysłać kilka danych. To chyba się nie uda bo on i tak weźmie tą ostatnią. Narazie musze rozwiązać ten problem. Czyli jak wysłać formularzem n liczb jedną zmienną?
darko
Aa, myślałem, że w formularzu masz tak:

<tag_html name="nr_kj[]"></tag_html>

W Twoim przypadku następna wartość zmiennej o tej samej nazwie nadpisze poprzednią, więc po prostu użyj różnych nazw zmiennych
apkc
Tak by było najprościej użyć różnych nazw. Problem jest tylko taki że już ten komponent o tej nazwie jest wprowadzany za pomocą pętli. Sprawa polega natym że pobieram z bazy różne dane i za pomocą checkboxa zaznaczam dane do dalszej edycji. Niewiem ile będzie tych checkboxów i nie wiem które zostana zaznaczone do dalszej edycji.
darko
W takim razie ponazywaj je przykładowo chk-XXX i jak odbierasz dane to wyciągnij je tak:

  1. $chks = array();
  2. foreach($_REQUEST as $k => $v) {
  3. if(preg_match("/chk-/", $k) != 0) {
  4. $chks[$k] = $v;
  5. }
  6. }
  7. // i masz już tablicę asocjacyjną nazwa_parametru => wartość_parametru
  8. // w miejscu $_REQUEST wstaw metodę, którą wysyłasz formularz ($_POST/$_GET)
apkc
Cytat(darko @ 28.01.2010, 14:22:10 ) *
W takim razie ponazywaj je przykładowo chk-XXX i jak odbierasz dane to wyciągnij je tak:

  1. $chks = array();
  2. foreach($_REQUEST as $k => $v) {
  3. if(preg_match("/chk-/", $k) != 0) {
  4. $chks[$k] = $v;
  5. }
  6. }
  7. // i masz już tablicę asocjacyjną nazwa_parametru => wartość_parametru
  8. // w miejscu $_REQUEST wstaw metodę, którą wysyłasz formularz ($_POST/$_GET)


Hmmm?! Jakby to powiedzieć? Wiesz jak sama nazwa tego forum mówi to jest przedszkole i ja chyba własnie zaczołem do niego chodzić :-) ! Czy możesz mi tą pętlę wyjaśnić?
Dzięki
darko
  1. $chks = array();
  2. // dla każdego elementu superglobalnej tablicy asocjacyjnej ($_REQUEST lub $_POST lub $_GET)
  3. foreach($_REQUEST as $k => $v) {
  4. // sprawdź czy nazwa klucz zawiera ciąg "chk-"
  5. if(preg_match("/chk-/", $k) != 0) {
  6. // jeśli zawiera - wyłap wartość dla znalezionego klucza i zapisz go do tablicy asocjacyjnej $chks
  7. $chks[$k] = $v;
  8. }
  9. }
  10. // teraz polecam zrobić:
  11. print_r($chks);
  12. // i zobaczyć, że mamy "ściągnięte" pary klucz => wartość
#luq
Mała dygresja. darko dlaczego pchasz wyrażenie regularne tam gdzie go nie potrzeba.
Wyrażenia są wolniejsze od wycinania stringów więc tam gdzie ich nie potrzeba lepiej stosować funkcje substr(), a więc

  1. if( substr( $k, 0, 4 ) == 'chk-' ){
  2. // ...
  3. }
apkc
Dzięki bardzo powalczę nad tym. Tylko jeśli dobrze zrozumiałem każda zmienna wysyłana za pomocą formularza musi zaczynać się od chk-xxx pod x muszą być różne wartości?
darko
Cytat(#luq @ 29.01.2010, 12:47:25 ) *
Mała dygresja. darko dlaczego pchasz wyrażenie regularne tam gdzie go nie potrzeba.
Wyrażenia są wolniejsze od wycinania stringów więc tam gdzie ich nie potrzeba lepiej stosować funkcje substr(), a więc

  1. if( substr( $k, 0, 4 ) == 'chk-' ){
  2. // ...
  3. }

Z przyzwyczajenia winksmiley.jpg ale masz rację.


Cytat(apkc @ 29.01.2010, 12:56:33 ) *
Dzięki bardzo powalczę nad tym. Tylko jeśli dobrze zrozumiałem każda zmienna wysyłana za pomocą formularza musi zaczynać się od chk-xxx pod x muszą być różne wartości?



Tak, tzn. np.:
  1. <input type="chechbox" name="chk-1" /> zaznacz mnie
  2. <input type="chechbox" name="chk-2" /> zaznacz mnie
  3. ...
  4. <input type="chechbox" name="chk-10" /> zaznacz mnie
  5. <input type="chechbox" name="chk-11" /> zaznacz mnie

itd.
apkc
Ok. Ten temat to akurat rozwiązałem troszkę inaczej
  1. <input type='checkbox' name='chk-$id'>

$id jest pobierana z bazy i jest różna dla każdego wiersza więc przeskoczyłem to tak.

Więc twierdzicie że to rozwiązanie
  1. if( substr( $k, 0, 4 ) == 'chk-' ){
  2. // ...
  3. }

Jest lepsze. A co oznaczają te liczby 0 i 4 ?
darko
start i długość, zobacz: http://pl.php.net/substr
IMO w Twoim przypadku wzrost wydajności będzie żaden, więc nie ma różnicy czy użyjesz substr czy preg_match.
apkc
Jeszcze raz dziękuję!
Pozdrawiam

Jeszcze jedno jak z tego wyciągnąć samą wartość?

  1. Array ( [chk-2] => 2 [chk-4] => 4 [chk-6] => 6)

Aby było coś takiego
  1. Array(2,4,6,)


Czy tą funkcję dało by się wykorzystać
  1. if( substr( $k, 0, 4 ) == 'chk-' ){
  2. // ...
  3. }

Jeżeli np zacznę od 10 znaku?
darko
Cytat(apkc @ 29.01.2010, 13:17:20 ) *
Jeszcze raz dziękuję!
Pozdrawiam

Jeszcze jedno jak z tego wyciągnąć samą wartość?

  1. Array ( [chk-2] => 2 [chk-4] => 4 [chk-6] => 6)

Aby było coś takiego
  1. Array(2,4,6,)


  1. $wartosci = array_values($chks);


Jeśli chcesz zacząć od 10-go znaku, to np.
  1. for($i=9, $i < count($wartosci); $i++) {
  2. // i tutaj operacje na elementach tablicy z wartościami, zaczynając od 10-go,np.
  3. echo $wartosci[$i];
  4. }
emtiej
Tak jak kolega darko ci podał wyżej:
  1. $chks = array();
  2. foreach($_REQUEST as $k => $v) {
  3. if(preg_match("/chk-/", $k) != 0) {
  4. $chks[$k] = $v;
  5. }
  6. }
  7. // i masz już tablicę asocjacyjną nazwa_parametru => wartość_parametru
  8. // w miejscu $_REQUEST wstaw metodę, którą wysyłasz formularz ($_POST/$_GET)


Tylko zamiast tworzyć tablicę dwu wymiarową stwórz zwykłą, czyli zastąp
  1. $chks[$k] = $v;
tym:
  1. $chks[]=$v;
apkc
W dalszym ciągu zwraca mi coś takiego
  1. Array ( [0] => 1 )


zależy mi aby w tym przypadku w nawiasie została tylko 1.
darko
Cytat(apkc @ 29.01.2010, 13:26:06 ) *
W dalszym ciągu zwraca mi coś takiego
  1. Array ( [0] => 1 )


zależy mi aby w tym przypadku w nawiasie została tylko 1.

Ale jak "sobie rozpiszesz" to, co podałeś: Array(2,4,6,) to właśnie będzie:

Array ( [0] => 2, [1] => 4, [2] => 6 )

Poczytaj o tablicach
i tutaj
apkc
JESZCZE RAZ WIELKIE DZIĘKI
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.