Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Zliczanie ilości w polach o tych samych id w bazie MySql lub tablicy sesyjnej
Forum PHP.pl > Forum > Przedszkole
kosmos
Witam
mam taki problem a w zasadzie 2.

mając taką tablicę sesyjną

Kod
Array (     [0] => Array ([id_numer] =>23[ilosc] =>2)
                                              [1]=> Array([id_numer] =>30[ilosc] =>10)
                                              [2] => Array([id_numer] =>23[ilosc] =>5))



Nie wiem jak zsumowaćw niej elementy o takim samym id_numer aby uzyskać taki wynik
Kod
Array (     [0] => Array([id_numer] =>23 [ilosc] =>7)
                       [1] => Array([id_numer] =>30[ilosc] =>10)

Szukałem gotowej funkcji wbudowanej w PHP ale niestety nie znalazłem żadnej , a własne próby zakończyły się fiaskiem sciana.gif

Następny problem dotyczy zapytania SQL do bazy.
Otóż mam taką tabele zamowień w bazie danych


Chodzi mi tu o rekomendację produktów... mianowicie obecnie oglądany przez klienta produkt, zaznaczyłem czerwoną otoczką. Nie wiem jak zrobić zapytanie do tej tabeli aby zwróciło ono wynik tylko i wyłącznie tych id_produkt`ów które były zakupione juz przez innych klientów wraz z obecnie ogladanym produktem czerwona otoczka ) z tym że aby ten produkt już nie wyświetlał się w zapytaniu oraz aby pod uwage nie były brane produkty z zamowien w których obecnie ogladany produkt nie był zakupiony. Aby to troszkę rozjaśnić wklejam wynik który chcę aby został zwrócony




Bardzo proszę o pomoc w tych problemach o jakiekolwiek wskazówki sugestie za które już teraz z góry dziękuję.
[/color]
soulreaver1
id_numer będzie określany przez użytkownika przed wyszukiwaniem, czy skrypt ma zsumować wszystkie wyniki o takich samych id_numer -ach ? Z kąd bierzesz tą tablice, może z mysql ?
kosmos
nie nie ... id_numer to numer który pobierany jest z bazy danych, jest on unikalny dla każdego z produktów i dokładnie skrypt ma zsumować po tablicy wszystkie ilości o tych samych id_numerach jesli się takie powtórzenia pojawią i zwrócić wynik np: w kolejnej tablicy już bez powtórzeń id_numer, a dane tej tablicy są jak najbardziej z tabeli bazy danych (sql)


Chcę uzyskać taki wynik jak podałem na początku

Dla jeszcze lepszego obrazu podaje taki przykład

Kod
| id_produkt | ilość |
----------------------
|    11      |  1    |
|    22      |  2    |
|    11      |  2    |
|    25      |  3    |
|    11      |  1    |
----------------------

| id_produkt | ilość |
----------------------
|    11      |  4    |
|    22      |  2    |
|    25      |  3    |
----------------------

pierwsza tabela dana
druga tabela to to co chcę osiągnąć
erix
A gdyby tak coś takiego?

  1. <?php
  2. $tablica = array(/*.....id_numer=>23............*/);
  3. $liczby = array();
  4.  
  5. foreach($tablica as $k=>$v){
  6. if(!isset($liczby[$k])){
  7. $liczby[$k] = 1;
  8. }else{
  9. $liczby[$k]++;
  10. }
  11. }
  12. ?>


Dostosuj sobie, mam nadzieję, że mnie zrozumiałeś. ;]
kosmos
OK to teraz bezpośrednio na kodzie ...

tablica

Kod
$_SESSION['tablica']

ma obecnie taką postac
Kod
[color="black"]Array (     [0] => Array([ean] => 5902222000317[ilosc] => 4)
   [1] => Array( [ean] => 5902222000307    [ilosc] => 2)
   [2] => Array    ([ean] => 5902222000317    [ilosc] => 1)
   [3] => Array    ([ean] => 5902222000337    [ilosc] => 1)  )[/color]


po zaimplementowaniu Twojego kodu
Kod
$tablica = $_SESSION['tablica'];
$liczby = array();

foreach($tablica as $k=>$v){
  if(!isset($liczby[$k])){
    $liczby[$k] = 1;
  }else{
    $liczby[$k]++;
  }
}


otrzymuje taką tablicę
Kod
[color="black"]Array (     [0] => 1     [1] => 1     [2] => 1     [3] => 1 ) [/color]

Chyba nie zrozumiałem Twojego przesłania sad.gif
erix
Zrozumiałeś. Tylko, że Twój kod powinien sprawdzać na kluczu podtablicy (ean), a nie na bezpośrednio na kluczu głównej tablicy. Zamiast $k przy sprawdzaniu warunków uwzględnij $v['ean'].
kosmos
Zrobiłem tak

Kod
$tablica = $_SESSION['tablica'];
$liczby = array();

foreach($tablica as $k=>$v)
   {
     if(!isset($v['ean']))
       {
         $liczby[$k] = 1;
       }
      else{  $liczby[$k]++;}
   }


I nadal mam
Kod
Array (     [0] => 1     [1] => 1     [2] => 1     [3] => 1 )


a z tego co podejrzewam chodzi o to zebym otrzymał
Array ( [5902222000317] => 5 [5902222000307] => 2 [5902222000337] => 1 )

PS: muszę dodać ze wczoraj się z tym męczyłem do 4 nad ranem ( w sumie dziś ) i nie wyszło smile.gif
phpion
Cytat(kosmos @ 16.04.2008, 17:48:31 ) *
Dla jeszcze lepszego obrazu podaje taki przykład

Kod
| id_produkt | ilość |
----------------------
|    11      |  1    |
|    22      |  2    |
|    11      |  2    |
|    25      |  3    |
|    11      |  1    |
----------------------

| id_produkt | ilość |
----------------------
|    11      |  4    |
|    22      |  2    |
|    25      |  3    |
----------------------

pierwsza tabela dana
druga tabela to to co chcę osiągnąć

Więc spróbuj takiego zapytania:
  1. SELECT id_produkt, SUM(ilosc) AS suma FROM tabela GROUP BY id_produkt;

Jeśli chciałbyś ograniczyć wynik do konkretnego id_produktu możesz pominąć grupowanie i dodać warunek:
  1. SELECT id_produkt, SUM(ilosc) AS suma FROM tabela WHERE id_produkt=123;
Gość
phpion to nie o to chodzi.

Pierwsze zapytanie zwróci tylko zsumowane zamówienia. WSZYSTKIE -> a nie takie jest oczekiwanie kosmosa.

A Drugie zapytanie też nie do końca pasuje bo wtedy ograniczy do jednego produktu i to również nie jest oczekiwanie kosmosa.
kosmos
Pisze do Was o 2ch różnych problemach ponieważ w sumie jest to jeden problem dotyczący rekomendacji który można rozwiązać na 2 sposoby

Jeśli teraz mówimy o zapytaniu sql to przypomne ze zalezy mi na tym aby z tabeli zamowien



otrzymac wynik

PiXel2.0
Napisalem takie dwie funkcje do tych tablic:

  1. <?php
  2. function my_sort($array){
  3. for($array_tmp = array(), $i = 0; $i < count($array); $i++)
  4. $array_tmp[$array[$i]['id_numer']] = $array[$i]['ilosc'] + (isset($array_tmp[$array[$i]['id_numer']]) ? $array_tmp[$array[$i]['id_numer']] : 0);
  5. $array_return = array();
  6. foreach($array_tmp as $id => $count)
  7. $array_return[] = array('id_numer' => $id, 'ilosc' => $count);
  8. return $array_return;
  9. }
  10. ?>


LUB

  1. <?php
  2. function my_sort2($array){
  3. $count = count($array);
  4. for($array_tmp = array(), $i = 0; $i < $count; $i++){
  5. if(isset($array_tmp[$array[$i]['id_numer']])){
  6. $array[$array_tmp[$array[$i]['id_numer']]]['ilosc'] += $array[$i]['ilosc'];
  7. unset($array[$i]);
  8. }else
  9. $array_tmp[$array[$i]['id_numer']] = $i;
  10. }
  11. return array_values($array);
  12. }
  13. ?>


Obie dzialaja tak jak chcesz, ale ta pierwsza chyba lepsza smile.gif
Druga jest troche zagmatwana i nawet mi raz Apache'a zawiesila biggrin.gif
erix
Cytat
a z tego co podejrzewam chodzi o to zebym otrzymał

Dokładnie.

  1. <?php
  2. $tablica = $_SESSION['tablica'];
  3. $liczby = array();
  4.  
  5. foreach($tablica as $k=>$v)
  6.  {
  7.  if(!isset($v['ean']))
  8.  {
  9.  $liczby[$k] = 1;
  10.  }
  11. else{ $liczby[$k]++;}
  12.  }
  13. ?>


Tylko, że trzeba wszędzie zamienić: :]

  1. <?php
  2. $tablica = $_SESSION['tablica'];
  3. $liczby = array();
  4.  
  5. foreach($tablica as $v)
  6.  {
  7.  if(!isset($v['ean']))
  8.  {
  9.  $liczby[$v['ean']] = 1;
  10.  }
  11. else{ $liczby[$v['ean']]++;}
  12.  }
  13. ?>


tu już klucza głównego nie trzeba

I powinno IMHO działać. :]
kosmos
Na początku z góry dziękuję za zaangażowanie smile.gif
Jeśli dobrze zrozumiałem to u mnie wywołanie funkcji jest takie

Kod
$zmienna=$_SESSION['tablica']
my_sort($zmienna);


a funkcja ma postać ( uzylem tej pierwszej )
Kod
function my_sort($zmienna){
     for($array_tmp = array(), $i = 0; $i < count($array); $i++)
         $array_tmp[$array[$i]['id_numer']] = $array[$i]['ilosc'] + (isset($array_tmp[$array[$i]['id_numer']]) ? $array_tmp[$array[$i]['id_numer']] : 0);
     $array_return = array();
     foreach($array_tmp as $id => $count)
         $array_return[] = array('id_numer' => $id, 'ilosc' => $count);
     return $array_return;
}


Wynik jaki otrzymuje po wywołaniu print_r($zmienna); to

Kod
[color="black"]Array (     [0] => Array         (             [ean] => 5902222000317             [ilosc] => 4         )      [1] => Array         (             [ean] => 5902222000307             [ilosc] => 2         )      [2] => Array         (             [ean] => 5902222000317             [ilosc] => 1         )      [3] => Array         (             [ean] => 5902222000337             [ilosc] => 1         )  )[/color]


czyli nadal coś nie tak bo nie zlicza tych samych elementów i wyświetla je obydwa





ODPOWIEDŹ DO ERIXA ( nie chce cytować i zaśmiecać smile.gif )

Dzięki udało się chyba to należało osiągnąć obecny wynik to

Kod
[color="black"]Array (     [5902222000317] => 2     [5902222000307] => 1     [5902222000337] => 1 )[/color]


Fajnie by było gdyby od razu zliczał konkretną ilość danego ean smile.gif Da się to zobić questionmark.gif
erix
Masz na myśli:
  1. <?php
  2. echo $liczby[TUTAJ KOD EAN];
  3. ?>

?
PiXel2.0
Cytat(kosmos @ 16.04.2008, 16:54:43 ) *
Witam
mam taki problem a w zasadzie 2.

mając taką tablicę sesyjną

Kod
Array (     [0] => Array ([id_numer] =>23[ilosc] =>2)
                                              [1]=> Array([id_numer] =>30[ilosc] =>10)
                                              [2] => Array([id_numer] =>23[ilosc] =>5))

Nie wiem jak zsumowaćw niej elementy o takim samym id_numer aby uzyskać taki wynik
Kod
Array (     [0] => Array([id_numer] =>23 [ilosc] =>7)
                       [1] => Array([id_numer] =>30[ilosc] =>10)

Szukałem gotowej funkcji wbudowanej w PHP ale niestety nie znalazłem żadnej , a własne próby zakończyły się fiaskiem sciana.gif


Podstawilem Twoja tablice z tematu i dziala tak jak chciales.
Widze, ze probowalem podstawiac liczby znacznie wieksze niz dopuszczalne w PHP (32bit) wiec moze tu jest problem.
kosmos
nie nei zobacz to jes tablica przed uzyciem twojego kodu
Kod
Array ([0] => Array([ean] => 5902222000317[ilosc] => 4)[1] => Array([ean] => 5902222000307[ilosc] => 2)
         [2] => Array([ean] => 5902222000317[ilosc] => 1)[3] => Array([ean] => 5902222000337[ilosc] => 1))



i fajnie by było aby Twoja pętla dawałami taki wynik
Kod
[color="black"]Array (     [5902222000317] => 5[5902222000307] => 2     [5902222000337] => 1 )[/color]

czyli sumowała nie liczne wystąpien danych eanów w tablicy ale sumowała wartości ilości tych eanów smile.gif
smile.gif




AD PiXel2.0

Możliwe jednak EAN-13 musi miec taka wartosc sad.gif
erix
Jeśli mi się dobrze wydaje, to:
  1. <?php
  2. if(!isset($v['ean']))
  3.  {
  4.  $liczby[$v['ean']] = 1;
  5.  }
  6. else{ $liczby[$v['ean']]++;}
  7. ?>


zamień na

  1. <?php
  2. if(!isset($v['ean']))
  3.  {
  4.  $liczby[$v['ean']] = $v['ilosc'];
  5.  }
  6. else{ $liczby[$v['ean']] += $v['ilosc'];}
  7. ?>


Cytat
Możliwe jednak EAN-13 musi miec taka wartosc

Rzutuj na stringa, będzie najbezpieczniej.
PiXel2.0
Zapisz ten skrypt i uruchom:

  1. <?php
  2.  
  3. function my_sort($array){
  4. for($array_tmp = array(), $i = 0; $i < count($array); $i++)
  5. $array_tmp[$array[$i]['ean']] = $array[$i]['ilosc'] + (isset($array_tmp[$array[$i]['ean']]) ? $array_tmp[$array[$i]['ean']] : 0);
  6. $array_return = array();
  7. foreach($array_tmp as $id => $count)
  8. $array_return[] = array('ean' => $id, 'ilosc' => $count);
  9. return $array_return;
  10. }
  11.  
  12. $array = array(
  13. => array(
  14. 'ean' => '5902222000317',
  15. 'ilosc' => '4'
  16. ),
  17. => array(
  18. 'ean' => '5902222000307',
  19. 'ilosc' => '2'
  20. ),
  21. => array(
  22. 'ean' => '5902222000317',
  23. 'ilosc' => '1'
  24. ),
  25. => array(
  26. 'ean' => '5902222000337',
  27. 'ilosc' => '1'
  28. )
  29. );
  30.  
  31. $array2 = my_sort($array);
  32. echo '<b>PRZED:</b><br />',str_replace("\n", '<br />', str_replace(' ', '&nbsp;', print_r($array, true))), '<br /><b>PO:</b><br />', str_replace("\n", '<br />', str_replace(' ', '&nbsp;', print_r($array2, true)));
  33.  
  34. ?>
kosmos
smile.gif Wynik to

Kod
[color="black"]Array (     [5902222000317] => 5     [5902222000307] => 2     [5902222000337] => 1 )


czyli oczekiwany smile.gif

Naprawdę bardzo Wam wszystkim dziękuję za zainteresowanie problemem w szczególności erix za dobrnięcie do celu oraz[/color] PiXel2.0 za sporą ilość kodu smile.gif

Już wciskam "pomógł" a administratora proszę o zamknięcie tematu jeśli uzna to za stosowane:)

Problem rozwiazany smile.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.