Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Szukanie w tablicy
northwest
post 10.07.2015, 12:15:24
Post #1





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Witam serdecznie,
Mam taki kod do dodawania wartości do tablicy:
  1.  
  2. $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));
  3.  


Co daje taką tablicę:
  1.  
  2. (
  3. [0] => Array
  4. (
  5. [id] => 4
  6. [nazwa] => nazwa1
  7. [cena] => 106.00
  8. )
  9.  
  10. [1] => Array
  11. (
  12. [id] => 4
  13. [nazwa] => nazwa1
  14. [cena] => 106.00
  15. )
  16.  
  17. [2] => Array
  18. (
  19. [id] => 4
  20. [nazwa] => nazwa1
  21. [cena] => 106.00
  22. )
  23.  
  24. [3] => Array
  25. (
  26. [id] => 2
  27. [nazwa] => nazwa
  28. [cena] => 100.00
  29. )
  30.  
  31. [4] => Array
  32. (
  33. [id] => 2
  34. [nazwa] => nazwa
  35. [cena] => 100.00
  36. )
  37.  
  38. [5] => Array
  39. (
  40. [id] => 4
  41. [nazwa] => nazwa1
  42. [cena] => 106.00
  43. )
  44.  
  45. [6] => Array
  46. (
  47. [id] => 2
  48. [nazwa] => nazwa
  49. [cena] => 100.00
  50. )
  51.  
  52. )
  53.  


W momencie gdy wyszukuję wartość za pomocą kodu:
  1.  
  2. $dubel = array_search(array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena'])), $_SESSION['koszykzamowien']);
  3.  


Otrzymuję indeks duplikatu - co jest super. Tylko 100% wartości musi się pokrywać - a chciałbym żeby tylko sprawdzało po 1.
Czy da się jednak szukać tylko i wyłącznie po ID ($_POST[imtemid])- a nie całej wartości dodawanej tablicy?


Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 12:18:52
Post #2





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




http://php.net/array_search
I masz tam w komentach recursive_array_search() - manual naprawde nie gryzie


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 12:56:22
Post #3





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


ta funkcja nie działa:
  1. $dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien']);

Zawsze zwraca 0 - pomimo tego że są duplikaty...

Próbowałem także czegoś takiego:
  1. $dubel = array_search($_POST['itemid'], array_column($_SESSION['koszykzamowien'], 'id'));


Ale także nie działa sad.gif
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 12:59:16
Post #4





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Pokaz DOKLADNIE co szukasz, pokasz DOKLADNIE co zawiera tablica, pokaz DOKLADNIE jaki dostajesz wynik.

Piszac DOKLADNIE mam na mysli zastosowanie var_dump()


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 13:05:26
Post #5





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Tablica zawiera:
  1. array(2) {
  2. [0]=>
  3. array(10) {
  4. ["id"]=>
  5. string(1) "4"
  6. ["nazwa"]=>
  7. string(6) "nazwa1"
  8. ["cena"]=>
  9. string(6) "106.00"
  10. ["ilosc"]=>
  11. string(1) "1"
  12. ["maxilosc"]=>
  13. string(1) "9"
  14. ["dostawa"]=>
  15. string(4) "0.00"
  16. ["vat"]=>
  17. string(1) "0"
  18. ["stanproduktu"]=>
  19. string(1) "1"
  20. ["aj_nazwa"]=>
  21. string(8) "czerwony"
  22. ["aj_rozmiarX"]=>
  23. string(1) "1"
  24. }
  25. [1]=>
  26. array(10) {
  27. ["id"]=>
  28. string(1) "4"
  29. ["nazwa"]=>
  30. string(6) "nazwa1"
  31. ["cena"]=>
  32. string(6) "106.00"
  33. ["ilosc"]=>
  34. string(1) "1"
  35. ["maxilosc"]=>
  36. string(1) "9"
  37. ["dostawa"]=>
  38. string(4) "0.00"
  39. ["vat"]=>
  40. string(1) "0"
  41. ["stanproduktu"]=>
  42. string(1) "1"
  43. ["aj_nazwa"]=>
  44. string(8) "czerwony"
  45. ["aj_rozmiarX"]=>
  46. string(1) "1"
  47. }
  48. }



Mam taki kod:

  1. if ($_POST['itemid'] != "") {
  2. //$dubel = array_search(array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena'])), $_SESSION['koszykzamowien']);
  3. //$dubel = array_search($_POST['itemid'], array_column($_SESSION['koszykzamowien'], 'id'));
  4. $dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien']);
  5. if($dubel == ""){
  6. $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));
  7. } else{
  8. echo "DUBEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
  9. $_POST['i_cena'] = 2;
  10. $_SESSION['koszykzamowien'][$dubel]['ilosc'] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));
  11. }
  12.  
  13. echo "==== $dubel =====";
  14. }
  15.  


Ten kod ma dodać produkt do sesji - jeśli nie było go jeszcze wcześniej, a jak był - to zmienić jego cenę na "2" smile.gif
Dodaje mi poprawnie, tylko ma problem z określeniem czy jest to dubel, czy też nie.
Wartości w tablicy będzie więcej niż na tym przykładzie, dlatego ważne jest dla mnie szukanie po ID smile.gif

Jeszcze raz dziekuję za pomoc smile.gif
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 13:07:20
Post #6





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Prosilem o 3 rzeczy. Dostalem tylko jedną... nie kojarze bym pisał po chinsku


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 13:09:04
Post #7





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Przepraszam, napisałem to w kodzie i opisie. OK, Już piszę ponownie
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 13:11:31
Post #8





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Chyba slepne, ale w kodzie co podales nie widze tego o co prosilem


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 13:12:44
Post #9





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Szukam w ten sposób:
  1. //$dubel = array_search(array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena'])), $_SESSION['koszykzamowien']);
  2. //$dubel = array_search($_POST['itemid'], array_column($_SESSION['koszykzamowien'], 'id'));
  3. $dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien']);


Potrzebuję sprawdzić czy w tablicy $_SESSION['koszykzamowien'] znajduje się już wartość, którą chcę dodać:
  1. $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']);

Jeśli nie istnieje - to dodaję powyższą wartość.
Jeśli istnieje to chcę zmienić jej cenę na "2":
  1. $_SESSION['koszykzamowien'][$dubel]['ilosc'] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));



Mam nadzieję że dobrze to opisałem. Dziękuję bardzo za pomoc i przepraszam za kłopot.
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 13:14:32
Post #10





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Jak dla mnie to zdanie:
Cytat
Pokaz DOKLADNIE co szukasz, pokasz DOKLADNIE co zawiera tablica, pokaz DOKLADNIE jaki dostajesz wynik.
jest jednoznaczne i wyraźnie mowi co chcialbym zobaczyc. Nadal tego nie zobaczylem, poklady mojej cierpliwosci zostaly wyczerpane, odchodzę wiec w pokoju bo zaraz zaczne tu rzucać łaciną smile.gif
Milego dnia.


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 13:17:21
Post #11





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Tablica zawiera:
  1. echo "<pre>";
  2. var_dump ($_SESSION['koszykzamowien']);
  3. echo"</pre><br/><br/>";
  4.  
  5. array(2) {
  6. [0]=>
  7. array(10) {
  8. ["id"]=>
  9. string(1) "4"
  10. ["nazwa"]=>
  11. string(6) "nazwa1"
  12. ["cena"]=>
  13. string(6) "106.00"
  14. ["ilosc"]=>
  15. string(1) "1"
  16. ["maxilosc"]=>
  17. string(1) "9"
  18. ["dostawa"]=>
  19. string(4) "0.00"
  20. ["vat"]=>
  21. string(1) "0"
  22. ["stanproduktu"]=>
  23. string(1) "1"
  24. ["aj_nazwa"]=>
  25. string(8) "czerwony"
  26. ["aj_rozmiarX"]=>
  27. string(1) "1"
  28. }
  29. [1]=>
  30. array(10) {
  31. ["id"]=>
  32. string(1) "4"
  33. ["nazwa"]=>
  34. string(6) "nazwa1"
  35. ["cena"]=>
  36. string(6) "106.00"
  37. ["ilosc"]=>
  38. string(1) "1"
  39. ["maxilosc"]=>
  40. string(1) "9"
  41. ["dostawa"]=>
  42. string(4) "0.00"
  43. ["vat"]=>
  44. string(1) "0"
  45. ["stanproduktu"]=>
  46. string(1) "1"
  47. ["aj_nazwa"]=>
  48. string(8) "czerwony"
  49. ["aj_rozmiarX"]=>
  50. string(1) "1"
  51. }
  52. }
  53.  



Szukana wartość:
  1. echo "<pre>";
  2. var_dump (array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));
  3. echo"</pre><br/><br/>";
  4.  
  5.  
  6. array(10) {
  7. ["id"]=>
  8. string(1) "4"
  9. ["nazwa"]=>
  10. string(6) "nazwa1"
  11. ["cena"]=>
  12. string(6) "106.00"
  13. }


wynik jaki otrzymuję z powyższego kodu to: ==== 0 =====

Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 13:19:21
Post #12





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




No i wszystko sie zgadzasz.... szukasz '4', '4' znajduje sie w tablicy pod indeksem 0..................

Popraw wiec laskawie ten warunek
if($dubel == ""){
bo po takim czasie na forum juz moglbys rozrozniac porownywanie wartosci do FALSE od porownania do niczego


Lektura obowiazkowa
==
===


empty
0
""
null
false


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 13:25:29
Post #13





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Właśnie nie dobrze, bo w przypadku takiej tablicy:
  1. array(4) {
  2. [2]=>
  3. array(10) {
  4. ["id"]=>
  5. string(1) "2"
  6. ["nazwa"]=>
  7. string(5) "nazwa"
  8. ["cena"]=>
  9. string(6) "100.00"
  10. ["ilosc"]=>
  11. string(1) "1"
  12. }
  13. [3]=>
  14. array(10) {
  15. ["id"]=>
  16. string(1) "2"
  17. ["nazwa"]=>
  18. string(5) "nazwa"
  19. ["cena"]=>
  20. string(6) "100.00"
  21. ["ilosc"]=>
  22. string(1) "1"
  23. }
  24. [0]=>
  25. array(10) {
  26. ["id"]=>
  27. string(1) "4"
  28. ["nazwa"]=>
  29. string(6) "nazwa1"
  30. ["cena"]=>
  31. string(6) "106.00"
  32. ["ilosc"]=>
  33. string(1) "1"
  34. }
  35. [1]=>
  36. array(10) {
  37. ["id"]=>
  38. string(1) "4"
  39. ["nazwa"]=>
  40. string(6) "nazwa1"
  41. ["cena"]=>
  42. string(6) "106.00"
  43. ["ilosc"]=>
  44. string(1) "1"
  45. }
  46. }



także zwraca 0 - i nie zmienia na "2" - czyli coś nie gra sad.gif
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 13:37:48
Post #14





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Zacznij prosze czytac co sie do Ciebie pisze. To naprawde nie jest trudne.
Wartosc 4 nadal znajduje sie pod indeksem 0.

Juz ci napisalem co jest problemem. Problemem jest Twoj warunek. Napisalem ci ktory. Napisalem ci o czym masz poczytac.
Temat zamykam, bo ewidentnie potrzebujesz zachety by wkoncu zaczac myslec. W razie czego zapraszam na PW.

edit: otwieram. Nagle w magiczny sposob wszystko zaczelo działać... Nie ma jak dobra zachęta wink.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 14:14:31
Post #15





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Mam jeszcze jedno pytanie:

  1. function recursive_array_search($needle,$haystack) {
  2. foreach($haystack as $key=>$value) {
  3. $current_key=$key;
  4. if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
  5. return $current_key;
  6. }
  7. }
  8. return false;
  9. }
  10.  
  11. $dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien']);
  12.  
  13. if($dubel === FALSE){
  14. $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']), 'ilosc' =>czysc_sql_liczby($_POST['ilosc']), 'aj_rozmiarX' =>baza_zapis($_POST['aj_rozmiarX']), 'aj_rozmiarX' =>baza_zapis($_POST['aj_rozmiar_wielkosc_X']));
  15. } else{
  16. echo "DUBEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
  17. $_SESSION['koszykzamowien'][$dubel]['ilosc'] = 2;
  18. }
  19.  


Czy jest możliwość za pomocą tego: recursive_array_search - wyszukanie po 3 kolumnach?

W sensie dubel = przy identycznym id oraz aj_rozmiarX i aj_rozmiar_wielkosc_X? smile.gif
Go to the top of the page
+Quote Post
nospor
post 10.07.2015, 14:18:38
Post #16





Grupa: Moderatorzy
Postów: 36 042
Pomógł: 6139
Dołączył: 27.12.2004




Musisz rozbudowac te funkcje i jako jej parametr zapodac tablice gdzie index to klucz jakiego szukasz a wartosc to wartosc jakiej szukasz. W tedy bedziesz mogl podac dowolną liczbe szukanych. Do dziela smile.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post 10.07.2015, 15:48:27
Post #17





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Kurczę, nie wiem jak to zrobić sad.gif

Kombinuje coś takiego:
  1. function recursive_array_search($needle, $haystack, $where1, $where2) {
  2. foreach($haystack as $key => $value) {
  3. $current_key=$key;
  4. // $where1 = aj_nazwa
  5. // $where2 = aj_rozmiar_wielkosc_X
  6. if($needle===$value OR ((is_array($value) && recursive_array_search($needle,$value) !== false) AND ($key['aj_nazwa'] == $where1 && $key['aj_rozmiar_wielkosc_X'] == $where2))) {
  7. return $current_key;
  8. }
  9. }
  10. return false;
  11. }


Jednak nie działa to i puszcza duplikaty sad.gif


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 Wersja Lo-Fi Aktualny czas: 17.08.2022 - 05:24