Eliminacion de valores duplicados en array

#1
Bueno aqui estoy de nuevo dando problemas :vientos:

El caso es, ya por fin puedo meter los datos en mi arreglo y guardarlos sin que se pierda nada, lo mismo que imprimirlos.

Ahora bien existe un detalle, pero veamos poco a poco esto:

Como les decia en el otro post de esta manera inserto los valores al arreglo:

PHP:
case 'add': 
       if (!$cart)  
        { 
$cart[]=array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio);
        }  
       else  
        { 
array_push($cart,array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio)); 
        }
Ok si inserto varios articulos obtengo esto:

Código:
Array
(
    [0] => Array
        (
            [ID] => Cable Sata Rojo UV
            [Cantidad] => 1 
            [Precio] => 40.00
        )

    [1] => Array
        (
            [ID] => Disco duro S-ata 150 GB 
            [Cantidad] => 1 
            [Precio] => 850.00
        )

    [2] => Array
        (
            [ID] => Procesador AMD Sempron LE-1250
            [Cantidad] => 1 
            [Precio] => 33.80
        )

    [3] => Array
        (
            [ID] => Cable Sata Rojo UV
            [Cantidad] => 1 
            [Precio] => 40.00
        )

)
Para ver esto paso mi arreglo por
PHP:
print_r($cart)
Ahora bien mi problema es el siguiente, como pueden ver tengo un articulo que se repite, me gustaria saber si ustedes conocen alguna forma de que esto no suceda, es decir que cuando inserte un articulo que ya esta en la cesta, este no se inserte dos veces si no que a "catidad" se le sume uno, es decir que quede asi:

Código:
Array
(
    [0] => Array
        (
            [ID] => Cable Sata Rojo UV
            [Cantidad] => 2 
            [Precio] => 40.00
        )

    [1] => Array
        (
            [ID] => Disco duro S-ata 150 GB 
            [Cantidad] => 1 
            [Precio] => 850.00
        )

    [2] => Array
        (
            [ID] => Procesador AMD Sempron LE-1250
            [Cantidad] => 1 
            [Precio] => 33.80
        )
)
Ya estuve moviendole un poco pero aun no logro hacerlo funcionar como deberia, ya probe con unset,array_pop, in_array, array_search, etc.

De ante mano muchas gracias y espero que alguien pueda ayudarme
 

yisus

Bovino adicto
#2
Cada ves que insertes uno nuevo primero busca si ya exite uno, lo podrias hacer con una funcion de esta forma

PHP:
/*
 *  $producto es el arreglo que inserta
 *  $cart es el arreglo donde lo inserta, se pasa por referencia
 *  Si $suma = true y ya hay un producto con ese id entonces lo suma sino lo reemplaza
 */
function addprod($producto, &$cart, $suma=true){
     if(!is_array($cart))
          $cart = array();
     $encontro = false;
     foreach($cart as $key=>$value)     {
          if(trim($value['ID']) == trim($producto['ID'])){
               if($suma== true)
                    $cart[$key]['cantidad'] += $producto['cantidad'];
               else
                    $cart[$key]= $producto;
               return ;
          }
     }
     if($encontro==false)
          $cart[] = $producto
}


case 'add': 
      // Si quieres que se sume la cantidad
       addprod(array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio), $cart) 

      // Si quieres que se reemplace
        addprod(array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio), $cart,false)
Espero te sirva lo hice ahorita y no lo pude probar pero la logica ahi esta, cualquier duda aqui estamos
 
#3
Hola Yisus, arme algo muy parecido a lo que me hiciste favor de proponer y casi tengo solucionado esto pero algo se me esta escapando. Te dejo el codigo para ver si me peudes dar tu opinion.

switch ($action)
{
case 'add':if (!$cart) //SI NO EXISTE CART O ESTA VACIA
{
$cart[] = array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio);
}
else
{

$y=0; // CONTADOR
for($i=0; $i<count($cart); $i++)
{
if($cart[$y]['ID']==$id) // LEO TODOS LOS ID Y CHEKO SI EXISTE UNO IGUAL A MI REFERENCIA
{
$cart[$y]['Cantidad']=$cart[$y]['Cantidad']+1; // EN CASO DE EXISTIR SOLAMENTE LE SUMO 1
}
$y++;
}
array_push($cart,array("ID"=>$id,"Cantidad"=>$cantidad,"Precio"=>$precio));
}
}*//QUOTE]
Nuevamente mi problema radica en la insercion de un elemento repetido hasta ahorita he logrado que si el elemento ya se encuentra dentro del arreglo duplico la cantidad, pero no se como acomodar esto para que no se inserte de nuevo el elemento.

Gracias por tu ayuda
 

yisus

Bovino adicto
#4
para que te dibuje la sintaxis de codigo puedes ponerlo entre [p-h-p] [/p-h-p] (sin los guiones)

leete la documentacion

ingresa a la pagina de www.php.net y busca ahi las funciones, o puedes hacer esto

www.php.net/array_push

utilizar array_push es lo mismo que
$array[]

tambien leete sobre los ciclos For y foreach.

No entiendo para que utilizas una variable $y como contador si ya tienes a tu disposicion $i

esto:
Código:
if (!$cart) //SI NO EXISTE CART O ESTA VACIA
No te valida si no esta vacia, debes de validar si es un arreaglo con is_array() y entonces lo incertas con $array[] o con array_push().

Checa el codigo que te pase antes y analizalo.

Saludos
 
Arriba