Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]pętla w tablicy
apkc
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Jeśli dobrze zrozumiałem, to:
  1. $a = array();
  2. foreach($_POST['nr_kj'] as $p) {
  3. $a[] = $p;
  4. }


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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ą?
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
darko
post
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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)


Ten post edytował darko 28.01.2010, 14:22:58


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #7





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


  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ść


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
#luq
post
Post #9





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował #luq 29.01.2010, 12:48:50


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
apkc
post
Post #10





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
darko
post
Post #11





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.

Ten post edytował darko 29.01.2010, 13:00:06


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #12





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
darko
post
Post #13





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.

Ten post edytował darko 29.01.2010, 13:13:30


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #14





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował apkc 29.01.2010, 13:19:59
Go to the top of the page
+Quote Post
darko
post
Post #15





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował darko 29.01.2010, 13:23:56


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
emtiej
post
Post #16





Grupa: Zarejestrowani
Postów: 207
Pomógł: 18
Dołączył: 12.04.2009
Skąd: Rypin

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post
apkc
post
Post #17





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
darko
post
Post #18





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
apkc
post
Post #19





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

Ostrzeżenie: (0%)
-----


JESZCZE RAZ WIELKIE DZIĘKI

Ten post edytował apkc 30.01.2010, 20:38:05
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 10:13