Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Szukanie w tablicy
Forum PHP.pl > Forum > Przedszkole
northwest
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?


nospor
http://php.net/array_search
I masz tam w komentach recursive_array_search() - manual naprawde nie gryzie
northwest
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
nospor
Pokaz DOKLADNIE co szukasz, pokasz DOKLADNIE co zawiera tablica, pokaz DOKLADNIE jaki dostajesz wynik.

Piszac DOKLADNIE mam na mysli zastosowanie var_dump()
northwest
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
nospor
Prosilem o 3 rzeczy. Dostalem tylko jedną... nie kojarze bym pisał po chinsku
northwest
Przepraszam, napisałem to w kodzie i opisie. OK, Już piszę ponownie
nospor
Chyba slepne, ale w kodzie co podales nie widze tego o co prosilem
northwest
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.
nospor
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.
northwest
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 =====

nospor
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
northwest
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
nospor
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
northwest
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
nospor
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
northwest
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


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.