Foros del Web » Programando para Internet » PHP »

Carrito compra con arrays

Estas en el tema de Carrito compra con arrays en el foro de PHP en Foros del Web. Estoy intentando simular un carrito de compra solo con arrays, sin base de datos. El código añade nombre del producto introducido (mediante un formulario) y ...
  #1 (permalink)  
Antiguo 30/05/2010, 09:34
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Carrito compra con arrays

Estoy intentando simular un carrito de compra solo con arrays, sin base de datos.

El código añade nombre del producto introducido (mediante un formulario) y la cantidad que queremos. Eso lo hace bien para uno o varios artículos.

El problema viene con el precio. Solo funciona para un artículo, si meto más productos el precio del artículo anterior lo machaca (no así la cantidad y nombre del artículo).

Paso el código a ver si alguién me puede echar una mano:

Cita:

<?php
include("datos.php"); // codigo donde se recogen los datos en varios arrays

//recogemos los valores del formulario y los asignamos variables


$preart = $_GET[preart]; //precio del articulo
$nomart = $_GET[nomart]; //Nombre del articulo
$cantidad = $_GET[cantidad]; //Cantidad de articulo



// Creamos sesiones dos sesiones, una la utilizaremos para calcular la cantidad de productos y el modelo del producto y otra para el precio de cada producto

$_SESSION[cantidadcesta]=$cantidadcesta;
$_SESSION[preciocesta]=$preciocesta;

// Si el nombre del articulo no esta vacio creamos un array con el primer articulo(modelo) introducido y lo recorremos todo el array con un bucle
// Le sumamos los valores del array anterior a la cantidad si ya habiamos introducido ese artículo(modelo).

if (isset($nomart))
{
$cantidadcesta[$nomart]=$cantidad;
foreach($cantidadcesta as $modelo => $unidad)
{
if($cantidadcesta == $modelo)
{
$cantidadcesta[$modelo]+=$cantidad;
$encontrado = 1;
}
}
if (!$encontrado)
{
$cantidadcesta[$nomart]=$cantidad;
}

}

// Si el precio no esta vacio metemos en un array el valor del primer precio intriducido. Recorremos con un bucle el array para ver si ya se había intorducido. En ese caso
// vamos sumando.

if (isset($preart))
{
$preciocesta[$cantidad]=$preart;

foreach($preciocesta as $model => $precio)
{
if ($preciocesta == $model)
{
$preciocesta[$model]+=$preart;
$econtrado2 = 1;
}

if (!$encontrado2)
{
$preciocesta[$nomart]=$preart;
}

}
}

// Coge de la array creado en datos.php los dos primeros datos y los muestra. Crea un formulario y pasa los datos que necesitamos (nomart, preart y cantidad)
// pasa mediante un campo oculto (hidden) para posteriormente mostrar el carrito.

if ($_GET[idmarca] == 0)
{
for ($i=0; $i<=1; $i++)
{
?>
<form action="<?=$PHP_SELF."?".$SID?>" method="get"/>
<fieldset> <legend> Compra portatil </legend> <br/>
<blockquote>
<h1><?php echo $articulo[$i];?></h1>
<p><?php echo $detalleart[$i];?></p>
<p>Precio: <?php echo $precioart[$i];?> &nbsp; Euros</p>
</blockquote>
<input type="hidden" name="nomart" value="<?php echo $articulo[$i]?>"/>
<input type="hidden" name="preart" value="<?php echo $precioart[$i]?>"/>
<input type="hidden" name="cantidad" value="1"/>
<input type="submit" name="Enviar" value="Comprar"/> <br/>
</fieldset>
</form>
<br/>
<?php
}
}

// Mostramos el carrito.

if(isset($cantidadcesta))
{
echo "<div>Cesta de compra es:</div><br/>";

foreach ($cantidadcesta as $modelo => $unidad)
{
if ($unidad>0)
{
//$preciototal+=$preart*$unidad;
echo "<div> Art&iacute;culo: ".$modelo."<br/>";
echo "<div> Unidades: ".$unidad." </div><br/>";
echo "<div> Precio: ".$precio."<br/>";
// echo "<div>---------------------------------------------</div>";
//}
}
}
}
?>
  #2 (permalink)  
Antiguo 30/05/2010, 10:32
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Carrito compra con arrays

El precio seria un tercer valor (externo) que sí podrias recuperar de la base de datos, luego le sumas la cantidad de ese producto y te daria el total (subtotal),

O sea: primero almacenas producto => cantidad todo e un array (siendo los productos los indices).
Al final, cundo muestras, recorres ese array, y en cada itaracion recuperas el nombre del producto (o lo que sea) y lo usas para hacer una consulta a la base de datos.

De lo contrario tu array ya se convertiria en un array multidimencional, por ende mas complejo.

Última edición por wiwi74; 30/05/2010 a las 10:42
  #3 (permalink)  
Antiguo 30/05/2010, 15:18
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Respuesta: Carrito compra con arrays

Agradezco el interés. Lo único es que la idea es hacerlo todo por arrays sin base de datos (mas que nada porque soy novato y todavía no trabajado apenas con bases de datos).

El temas es que cuando recorró con foreach el array solo puedo usar dos valores, Me gustaría saber si hay alguna manera de usar un valor más con foreach o si necesito otra clase de bucle para recorrer el array en el que quiero usar tres valores (nombre de articulo, precio y unidad) para luego mostrarlos. Ya teniendo el precio y la unidad de cada artículo solo tendría que multiplicar el precio por las unidades en cada artículo.

Es decir, supongo que la idea sería un bucle que me permita captrura de tres valores. Pero no se me ocurre como hacerlo, quizas usando varios for o algo así.
  #4 (permalink)  
Antiguo 31/05/2010, 16:03
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Carrito compra con arrays

Se puede hacer con array's; porsupuesto que una bace de datos te permnitira mayor fiabilidad.

Podrias hacer asi (este es un simple ejemplo):

Código PHP:

$precioProducto 
= array("p1" => 10 ,"p2" => 20,"p3" => 12,"p4" => 33);

//cesta o carrito
//en realidad la cesta no figuraria asi si no que estaria almacenada en una variable
//por lo general de sesion
//esto es lo que se pidio hasta el momento
$cesta = array("p1" => ,"p2" => 4);


//recorres la cesta
foreach($cesta as $producto => $cantidad){
echo 
"<li>".$producto ." => "$cantidad ." Precio total ". ($precioProducto[$producto] * $cantidad);
}


//$precioProducto[$producto] devuelve el precio del producto
//luego lo multiplicas por la cantidad que se pidio
//($precioProducto[$producto] * $cantidad) 


Mira este aporte quiza te sirva tambien:
http://www.forosdelweb.com/f18/formu...3/#post3409749
  #5 (permalink)  
Antiguo 02/06/2010, 04:55
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Respuesta: Carrito compra con arrays

Entonces tendría que hacerlo con un array bidimensional. El problema tal vez era que estaba extrayendo los datos de un arrays de una dimensión. Me explico, yo tenía esto en datos.php:

$productos=array("patatin", "pataton"....)
$precios=array("450", 325"....)

Asi que tendría que meter las dos cosas (producto y precio) en un array, en vez de tenerlo separado en dos.

Mas luego la cantidad, que eso no esta en array, sino que la introduce el usuario(pero que se guarda en un array par aluego recorrelo).
  #6 (permalink)  
Antiguo 02/06/2010, 07:39
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Carrito compra con arrays

Si asi... es mas simple, al fin.

Ya que fisicamente solo debes tener un array....

Código PHP:

$productos 
= array("patatin" => 10"pataton" => 20 );

//Luego el otro se genera dinaminamente, ma o menos asi:

//Se declara el array (la cesta):

$pedidosRealizados = array();

//Y los valores se almacenan en ella mas o menos asi (con la tecnica apropiada):

$pedidosRealizados['patatin'] += 1//uno o mas de uno obvio
$pedidosRealizados['pataton'] += 2;  


//y el loop devolveria los nombres y las catidades
foreach($pedidosRealizados as $pro => $c){
//$productos[$pro] contendra el preciode dicho producto 
echo $pro ."Precio total: ".($productos[$pro] *  $c)."<br />";

  #7 (permalink)  
Antiguo 03/06/2010, 16:40
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Respuesta: Carrito compra con arrays

Muchas gracias, eres un crack. Hice justo eso y me funcionó. Mañana posteo el codigo.
  #8 (permalink)  
Antiguo 04/06/2010, 06:13
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Respuesta: Carrito compra con arrays

He restructurado todo el código, lo pongo aunque hay una sola cosa que falla y que me gustaría resolver:

Datos.php

Código PHP:
<?php
session_start
();
$idmarca = array("1","2""3""4""5""6""7");
$marca = array("Acer""Asus""Hp""Lenovo""Toshiba""MSI""Samsumg");

// Arrays con los detalles para cada producto

$acer = array("Acer Aspire 4500" => "Procesador T4400, 320 Gb disco duro, 4 Gb de memoria Ram""Acer Ferrari RL" => "Procesador P8600, 320 Gb disco duro, 4 Gb de memoria Ram");

$asus = array("Asus LR500" => "Procesador P8700, 320 Gb disco duro, 4 Gb de memoria Ram""Asus LR750" => "Procesador P8700, 500 Gb disco duro, 4 Gb de memoria Ram");

$hp = array("HP 4750" => "Procesador P8600, 320 Gb disco duro, 4 Gb de memoria Ram""HP4800" => "Procesador T4400, 500 Gb disco duro, 4 Gb de memoria Ram");

$toshiba = array ("Toshiba 4320" => "Procesador T5800, 250 Gb disco duro, 4 Gb de memoria Ram");

$msi = array( "MSI CX5600" => "Procesador P8700, 320 Gb disco duro, 4 Gb de memoria Ram""MSI CXS650" => "Procesador P8700, 320 Gb disco duro, 4 Gb de memoria Ram""MSI CXS700"=> "Procesador P8500, 320 Gb disco duro, 4 Gb de memoria Ram");                                                

$lenovo = array("Lenovo FXJ" => "Procesador T5800, 320 Gb disco duro, 4 Gb de memoria Ram""Lenovo FXD" =>  "Procesador P8600, 320 Gb disco duro, 4 Gb de memoria Ram");

$samsung = array("Samsumg TRK" => "Procesador P8500, 320 Gb disco duro, 2 Gb de memoria Ram""Samsung RK500" =>  "Procesador T5800, 320 Gb disco duro, 4 Gb de memoria Ram",
              
"Samsung RK550" => "Procesador P8700, 320 Gb disco duro, 4 Gb de memoria Ram");

//Array para los precios asociados al nombre del producto

$producto = array("Acer Aspire 4500" => "400""Acer Ferrari RL" => "600""Asus LR500" => "650""Asus LR750" => "700""HP 4750" =>699"HP4800"=> "499""Lenovo FXJ" => "599",
            
"Lenovo FXD" => "625""Toshiba 4320" => "670""MSI CX5600" => "549",     "MSI CXS650" => "699",   "MSI CXS700" => "670""Samsumg TRK" => "680",
            
"Samsung RK500" => "570""Samsung RK500" => "620""Samsung RK550" => "670");

?>
Código marcas.php

Código PHP:
<?php
include("datos.php");
$preart $_GET[preart];
$nomart =  $_GET[nomart];
$cantidad $_GET[cantidad];

$_SESSION[cantidadcesta]=$cantidadcesta;

include(
"arriba.php"); //Parte superior con CSSS
?>

<div id="contentwrap">
  <div id="breadcrumb"><a href="cesta.php">Cesta</a> &raquo; <a href="http://www.free-css.com/">Somewhere</a></div>
  <div id="content"> <span class="floatright"><img src="assets/images/icon_email.gif" /><img src="assets/images/icon_print.gif" /></span>
    <h1>Port&aacute;tiles online</h1>
    <p> Venta de productos inform&aacute;ticos</p>
    <div class="hr">
      <hr />
    </div>
    <h1>Novedades</h1>
    <p> </p>
    
<?php
//Creamos una función para pintar el nombre del producto, los detalles y el precio (aunque esto último no va).

function pintarportatiles($varmodelo)
{
    foreach (
$varmodelo as $modelo => $detalles)
    {
    
?>
    <form action="<?=$PHP_SELF."?".$SID?>" method="get"/>
    <fieldset> <legend> Compra portatil </legend> <br/>
    <blockquote>
    <h1><?php echo $modelo;?></h1> 
    <p><?php echo $detalles;?></p>
    <p>Precio: <?php echo $producto[$modelo];?> &nbsp; Euros</p>
    </blockquote>
    <input type="hidden" name="nomart" value="<?php echo $modelo;?>"/>
    <input type="text" name="cantidad" value="1"/>
    <input type="submit" name="Enviar" value="Comprar"/> <br/>
    </fieldset>
    </form>
    <br/>
    <?php
        
}
    }    
    
    if (
$_GET[idmarca] == 0)
    {
    
pintarportatiles($acer);
    }
    
    if (
$_GET[idmarca] == 1)
    {
    
pintarportatiles($asus);    
    }
    
    if (
$_GET[idmarca] == 2)
    {
    
pintarportatiles($hp);    
    }
    
    if (
$_GET[idmarca] == 3)
    {
    
pintarportatiles($lenovo);    
    }
    
    if (
$_GET[idmarca] == 4)
    {
    
pintarportatiles($toshiba);    
    }
    
    if (
$_GET[idmarca] == 5)
    {
    
pintarportatiles($msi);    
    }
    
    if (
$_GET[idmarca] == 6)
    {
    
pintarportatiles($samsung);    
    }
    
?>       
     </div>

<?php

    
//Introducimos los valores de la sesión en un array de sesion con el nombre y la cantidad del producto    
    
$cantidadcesta[$nomart]=$cantidad;
    
    if(isset(
$cantidadcesta))
    {
        echo 
"<div>Cesta de compra es:</div><br/>";
            
            
//Recorremos el array y lo mostramos. Para mostrar el precio recorremos a la tabla producto que tenomos en datos.php
            
foreach ($cantidadcesta as $modelo => $unidad)
            {
            if (
$unidad>0)
                {
                    echo 
"<div> Producto: ".$modelo."<br/>";
                    echo 
"<div> Unidades: ".$unidad." </div>";
                    echo 
"<div> Precio: ".$producto[$modelo]."X".$unidad." = ".$producto[$modelo]*$unidad."</div><br/>";
                }
            }                
    }
    
include(
"abajo.php"); // Parte inferior con CSS
?>
La cesta funciona bien. Lo único que cuando se muestran los datos de los productos (antes de añadirlo a la cesta), el precio no lo coge ya que el array que recorre ($acer, $hp...) es de dos dimensiones, y por lo que sea no lo pilla de la tabla productos. Imagino que en vez de foreach se puede hacer un for y crear dos tablas más para cada producto. Por ejemplo:

$acer=array("acer ferrari", "Acer aspire".....);
$precioacer=array("400", "600".....);
$detalleacer=array("procesador tal.....", "porecsado, disco duro....");

for ($i=0; $i<count($acer) $i++)
{
echo "producto: ".$acer[$i];
echo "detalles: ".$detalleacer[$i];
echo "precio: ".$precioacer[$i];
}


Sin embargo también se me había ocurrido hacerlo todo en un array tridimensinal, asi queda todo en una variable:

$acer = array("Acer Aspire 4500" =>
array(detalles => "Procesador T4400, 320 Gb disco duro, 4 Gb de memoria Ram", precio => "400"),
"Acer Ferrari RL" =>
array(detalles=> "Procesador P8600, 320 Gb disco duro, 4 Gb de memoria Ram", precio =>"600")
);

Pero aqui viene la pregunta, ¿como se podría recorrer un array así para que me muestre todos los valores?
  #9 (permalink)  
Antiguo 04/06/2010, 08:32
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 16 años, 1 mes
Puntos: 10
Respuesta: Carrito compra con arrays

Santas globales...!

Lo que sucede es que deseas acceder al valor de una variable desde DENTRO de una funcion... lo cual no puedes. Se llama alcance de una variable, o ambito de la variable (estudiate eso)

Para que a esa variable la puedas acceder debes declararla como global.


Dentro de esa funcion escribe:


Código PHP:

//recorte de codigo

function pintarportatiles($varmodelo
{
    global 
$producto
    foreach (
$varmodelo as $modelo => $detalles
    { 

    
//............

    

  #10 (permalink)  
Antiguo 04/06/2010, 10:02
 
Fecha de Ingreso: mayo-2010
Mensajes: 128
Antigüedad: 13 años, 10 meses
Puntos: 13
Respuesta: Carrito compra con arrays

Gracias, eres una hacha. Ya funciona y sin necesidad de crear mas arrays.
Me miraré eso, y de paso estudiare como rehacerlo para que funcione con bases de datos.

Un saludo.

Etiquetas: arrays, carrito, compra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:36.