Filtrare și afișare informații din array

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

iulianba
Average Member
Mesaje: 74
Membru din: Joi Mar 24, 2011 6:10 pm

Filtrare și afișare informații din array

Mesajde iulianba » Lun Apr 01, 2013 12:40 pm

Salut, am o problemă cu afișarea unor informații primite dintr-o sesiune. Ceea ce îmi returnează sunt informațiile următoare:

Cod: Selectaţi tot

array(3) {
  [0]=>
  array(4) {
    ["gramaj"]=>
    string(4) "230g"
    ["id_produs"]=>
    string(1) "4"
    ["numar_produs"]=>
    string(1) "1"
    ["cantitate"]=>
    string(1) "1"
  }
  [1]=>
  array(4) {
    ["gramaj"]=>
    string(4) "230g"
    ["id_produs"]=>
    string(1) "7"
    ["numar_produs"]=>
    string(1) "1"
    ["cantitate"]=>
    string(1) "2"
  }
  [2]=>
  array(4) {
    ["gramaj"]=>
    string(4) "230g"
    ["id_produs"]=>
    string(1) "7"
    ["numar_produs"]=>
    string(1) "1"
    ["cantitate"]=>
    string(1) "1"
  }
}

Fac un foreach, pentru a putea manipula fiecare produs în parte și ulterior a-l afișa într-un tabel. Știu, creez de asemenea o nouă structură de array - o să fac în viitor direct să vină sesiunea în structura asta. Momentan am așa ceva:

Cod: Selectaţi tot

 foreach($_SESSION['cart'] as $key => $item)
{
     $produse[$key] = array($item['id_produs']=>array('id' => $item['id_produs'], 'cantitate' => $item['cantitate'], 'gramaj' => $item['gramaj'], 'nr' => $item['numar_produs']));
}
<?php

        foreach ($produse as $key => $produs)
        {
            foreach($produs as $key => $produs )
            {

                ?>
            <tr>
                <td><?=$produs['id'].' '.$produs['gramaj']; ?></td>
                <td><input type="text" id="cart_cantitate" name="cart_cantitate" value="<?=$produs['cantitate'];?>"></td>
                <td>10</td>
            </tr>
         <?php
            }
        }
        ?>


Ok, acum problema mea. Am mai multe produse cu diferite gramaje fiecare.
În exemplul arătat aici am așa ceva:
Produs X - 230g
Produs Y - 230g
Produs X - 230g
Să explic și ce am făcut. Am comandat produsul X de 230g cu 2 cantități. Apoi am comandat produsul Y de 230g - o singură unitate. Apoi am mai comandat produsul X de 230g o dată.
Aș vrea ca în tabel să afișez totalul, de genul:

Produs x - 230g - 3 bucăti
Produs y - 230g - 1 bucată

Codul de mai sus îmi afișează fiecare item separat:
Produs x - 230g - 2 bucăti
Produs y - 230g - 1 bucată
Produs x - 230g - 1 bucată

Nu am nicio idee, aveți ceva sugestii?
Mulțumesc anticipat



Avatar utilizator
Andrei HAINAROSIE
PHPRomania Supporter
Mesaje: 15
Membru din: Joi Oct 18, 2012 8:20 pm
Localitate: Bucuresti
Contact:

Re: Filtrare și afișare informații din array

Mesajde Andrei HAINAROSIE » Lun Apr 01, 2013 4:51 pm

Salut,

Cred ca cel mai corect ar fi ca inainte de a salva in $_SESSION['cart'] noul produs, sa verifici daca exista.

Ai product_id - care ar trebui sa fie unic.

Ai putea verifica if (isset($_SESSION['cart'][$product_id])) { // aici incrementezi cantitea}


In codul tau, insa, primul foreach ar putea fi ceva de genul:

Cod: Selectaţi tot

foreach($_SESSION['cart'] as $item) {
if (isset($produse[$item['id_produs']]) {
     $produse[$item['id_produs']]['cantitate'] += $item['cantitate'];
}
else {
     $produse[$item['id_produs']] = $item;
}

iulianba
Average Member
Mesaje: 74
Membru din: Joi Mar 24, 2011 6:10 pm

Re: Filtrare și afișare informații din array

Mesajde iulianba » Mar Apr 02, 2013 8:35 am

Nu îmi returnează corect acel foreach.
Am încercat să fac incrementarea înainte de a salva sesiunea, și m-am lovit de altă problemă.

Cod: Selectaţi tot

if(isset($_SESSION['cart']))
    {
        foreach($_SESSION['cart'] as $key => $item)
        {
            if($item['id_produs'] == $id_produs and $item['gramaj'] == $gramaj_produs)
            {
                $_SESSION['cart'][$key]['cantitate'] += $cantitate;
            }
        }
    }
    else
    {
        $cart = array('id_produs' => $id_produs, 'gramaj'=>  $gramaj_produs, 'numar_produs' => $product_number, 'cantitate' => $cantitate);
    }

    $_SESSION['cart'][] = $cart;


Problema intervine atunci când am același id de produs dar gramaj diferit. Am pun un else în foreach, doar că nu îmi mai incrementează deloc după - doar adaugă produsele.

Avatar utilizator
Andrei HAINAROSIE
PHPRomania Supporter
Mesaje: 15
Membru din: Joi Oct 18, 2012 8:20 pm
Localitate: Bucuresti
Contact:

Re: Filtrare și afișare informații din array

Mesajde Andrei HAINAROSIE » Mie Apr 03, 2013 11:36 am

Din moment ce ai gramaje separate, mi se pare firesc sa-ti afiseze produsele ca item-uri separate.

iulianba
Average Member
Mesaje: 74
Membru din: Joi Mar 24, 2011 6:10 pm

Re: Filtrare și afișare informații din array

Mesajde iulianba » Mie Apr 03, 2013 11:39 am

Andrei HAINAROSIE scrie:Din moment ce ai gramaje separate, mi se pare firesc sa-ti afiseze produsele ca item-uri separate.

Și mie, numai că nu asta este problema.
Adaug să zicem 2 bucăti de 230grame, apoi o bucată de 350g iar apoi adaug iar una de 230g.
Ce îmi adaugă mie este: 2x230g, 1x350g, 1x230g.
Nu mai iterează dacă adaug acolo un else.

Avatar utilizator
Andrei HAINAROSIE
PHPRomania Supporter
Mesaje: 15
Membru din: Joi Oct 18, 2012 8:20 pm
Localitate: Bucuresti
Contact:

Re: Filtrare și afișare informații din array

Mesajde Andrei HAINAROSIE » Mie Apr 03, 2013 11:50 am

Nu-mi dau seama numai din codul acesta.

iulianba scrie:Nu îmi returnează corect acel foreach.
Am încercat să fac incrementarea înainte de a salva sesiunea, și m-am lovit de altă problemă.

Cod: Selectaţi tot

if(isset($_SESSION['cart']))
    {
        foreach($_SESSION['cart'] as $key => $item)
        {
            if($item['id_produs'] == $id_produs and $item['gramaj'] == $gramaj_produs)
            {
                $_SESSION['cart'][$key]['cantitate'] += $cantitate;
            }
        }
    }
    else
    {
        $cart = array('id_produs' => $id_produs, 'gramaj'=>  $gramaj_produs, 'numar_produs' => $product_number, 'cantitate' => $cantitate);
    }

    $_SESSION['cart'][] = $cart;


Problema intervine atunci când am același id de produs dar gramaj diferit. Am pun un else în foreach, doar că nu îmi mai incrementează deloc după - doar adaugă produsele.

Reventon
Average Member
Mesaje: 68
Membru din: Lun Ian 31, 2011 5:07 pm

Re: Filtrare și afișare informații din array

Mesajde Reventon » Joi Apr 04, 2013 10:58 pm

la fel cum a spus si Andrei, fiecare produs trebuie sa aiba un id unic.

dar, tu pentru un produs ai xx nivele de gramaj.
eu cred ca din cauza asta ai probleme.

ex:
produsul Adidas marimea 40 si culoare albastru, nu trebuie sa aiba acelasi id ca produsul Adidas marimea 40 si culoarea alb.
sunt 2 produse distincte, chiar daca amandoua se numesc Adidas.

eu sunt de parere ca pentru a putea manipula corespunzator si stocul, aici ai nevoie de mai multe tabele.
poate vor exista persoane care ma vor contrazice, este dreptul lor:)

eu zic in felul urmator...
in primul rand iti trebuie 1 tabel principal, care va reprezenta produsul in sine, cumpus din atribute din alte tabele
ex:
- nume tabel 1:
main
- campuri:
id (int),
name (varchar)
description (varchar)
brand_id (int) - relatie cu tabelul 'brand' pe campul 'id'
model_id (int) - relatie cu tabelul 'model' pe campul 'id'
color_id (int) - relatie cu tabelul 'color' pe campul 'id'
size_id (int) - relatie cu tabelul 'size' pe campul 'id'
quantity (int)
price (double)
locked (enum sau tiny int)
available (enum sau tiny int)
inserted_at (datetime)
updated_at (datetime)
...

-nume tabel 2:
brand
- campuri:
id (int)
name (varchar)
code (varchar)
...

-nume tabel 3:
model
- campuri:
id (int)
name (varchar)
code (varchar)
...


-nume tabel 4:
color
- campuri:
id (int)
name (varchar)
code (varchar)
...

-nume tabel 5:
size
- campuri:
id (int)
name (varchar)
code (varchar)
...


sper ca nu am gresit nimic, sunt cam somnoros la ora asta


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 39 vizitatori