Cargando



Utilización de Array o Matrices avanzado y carrito de compras con PHP

En este tutorial os enseño el uso de Array (Martrices) en modo avanzado con todas sus opciones y cómo crear un carrito de compras con el lenguaje de programación PHP.


ago 24 2015 10:51
Profesional
Los arrays son vectores o matrices de una o varias dimensiones. Cuando programamos entendemos que es un conjunto de datos, en Java o .Net se utilizan específicamente para gestionar bases de datos y se conocen como Dataset.

El contenido que almacena una matriz de datos esta representado por una columna sera el campo o variable y filas que representan los datos en cuestión.

Un ejemplo de estructuras matriciales es una planilla de cálculos o una consulta a phpmyadmin o un carrito de compras.

matrices-avanzado.jpg


Por ejemplo en Excel si exportamos una planilla de cálculos a formato csv, separado por comas o tabulaciones luego podremos leer ese archivo desde php, convertirlo en un array e importarlo a una base de datos, veamos un ejemplo.

Tenemos una planilla de cálculos con ventas que queremos leer desde php para luego importar a una base de datos o actualizar registros.

matrices-avanzado2.jpg


Exportamos la plantilla ventas.xlsx a ventas.csv separado por comas, por lo que en archivo de texto la estructura quedara de la siguiente manera:

matrices-avanzado3.jpg


El código PHP para leer este archivo será el siguiente:
<?

$archivo = 'ventas.csv';

$fila = 0;

if (($archivocsv = fopen($archivo, "r")) !== FALSE) {

while (($datos = fgetcsv($archivocsv, 0, ",")) !== FALSE) {

  if($fila == 0){
   //si es la primer fila muestro los titulos de cada columna

   echo $datos[0].'  '.$datos[1].'  '.$datos[2].'  '.$datos[3].'<br/>';
   $fila++;

  } else {

// $datos[0] = producto; $datos[1] = precio compra; $data[2] = precio venta; $data[3] = ganancia
       

   echo $datos[0].'  '.$datos[1].'  '.$datos[2].'  '.$datos[3].'<br/>';
            // Aquí pondríamos la sentencia mysql para insertar o actualizarlos datos

  }

}

} else {

echo 'Fallo archivo csv.';
}


fclose($archivocsv);

?>

matrices-avanzado4.jpg


Este tipo de estructura es muy utilizada en la tiendas virtuales para los carritos de compra generalmente el usuario compra y los datos se almacenan en una matriz de sesión, cuando finaliza la compra se guardan esos datos en forma definitiva, esto permite que el usuario guarde los datos en la cache de su navegador y así no hacer tantas llamadas al servidor, veamos un ejemplo.

Creamos una sesión carrito a la que añadimos datos, esto se produciría luego de seleccionar el producto a comprar
<?php

session_start();

//Añado tres prudctos
$_SESSION['carrito'][1]  =  array('cantidad'=>2, producto'=>'Pantalón','color'=>'AZUL','precio'=>60.00);

$_SESSION['carrito'][2]  =  array('cantidad'=>2, 'producto'=>'Camisa','color'=>'Rojo','precio'=>70.00);
$_SESSION['carrito'][3]  =  array('cantidad'=>1, 'producto'=>'Zapatos','color'=>'Negro','precio'=>50.00);


              //Listo los productos que hay en el carrito

               echo '<table border=1>
     <tr><td>Producto</td><td>Color</td><td>Cantidad</td><td>Precio</td>';

             
                foreach($_SESSION['carrito'] as $fila){

     echo '<tr>
     <td>'.$fila['producto'].'</td>

     <td>'.$fila['color'].'</td>
     <td>'.$fila['cantidad'].'</td>

     <td>'.$fila['precio'].'</td></tr>';
                }

               
                echo '</table>';


//Muestro el array para ver como queda

echo "<pre>";
print_r($_SESSION['carrito']);

echo "</pre>";
?>

matrices-avanzado5.jpg


Funciones para gestionar y realizar operaciones con array o matrices

Dividir una matriz en partes o submatrices


Array_chunk nos permite dividir una matriz en partes iguales, la última parte puede contener menos elementos. Por ejemplo si tenemos una matriz muy grande podemos dividirla en varias partes.

Tomando el ejemplo anterior podemos dividir la matriz en 2 partes:
print_r(array_chunk($_SESSION['carrito'], 2));
Tenemos un array con tres elementos y los convertimos en dos array uno con 2 elementos y el otro con 1.
Array

(

    [0] => Array
        (

            [0] => Array
                (

                    [cantidad] => 2
                    [producto] => Pantalón

                    [color] => AZUL
                    [precio] => 60

                )

            [1] => Array
                (

                    [cantidad] => 2
                    [producto] => Camisa

                    [color] => Rojo
                    [precio] => 70

                )

        )

    [1] => Array
        (

            [0] => Array
                (

                    [cantidad] => 1
                    [producto] => Zapatos

                    [color] => Negro
                    [precio] => 50

                )

        )

)

Obtener los datos de una columna


Array_column() devuelve los datos de una columna dela matriz, se identifica la columna por su nombre clave.

Ejemplo mostremos por separado los datos de la columna productos y la columna precios.
echo "<pre>";
$productos = array_column($_SESSION['carrito'], 'producto');

$precios = array_column($_SESSION['carrito'], 'precio');
print_r($productos);

print_r($precios);
echo "</pre>";
El resultado columna producto:
Array
(

    [0] => Pantalón
    [1] => Camisa

    [2] => Zapatos
)

?>
El resultado columna precio:
Array

(
    [0] => 60

    [1] => 70
    [2] => 50

)

Ordenar una matriz por una o varias columnas


Array_multisort() puede usarse para ordenar varios arrays al mismo tiempo, o un array multidimensional por una o más dimensiones.
echo "<pre>";

// Obtener una lista de columnas
$datos=$_SESSION['carrito'];

//recorremos la columna a ordenar para obtener los datos
foreach ($datos as $clave => $fila) {

    $producto[$clave] = $fila['producto'];
}


// Ordenar los datos de productos en forma ascendente

array_multisort($producto, SORT_ASC, $datos);

//mostramos los datos
print_r($datos);

echo "</pre>";
?>
El resultado de este ordenamiento será:
Array

(
    [0] => Array

        (
            [cantidad] => 2

            [producto] => Camisa
            [color] => Rojo

            [precio] => 70
        )


    [1] => Array

        (
            [cantidad] => 2

            [producto] => Pantalón
            [color] => AZUL

            [precio] => 60
        )


    [2] => Array

        (
            [cantidad] => 1

            [producto] => Zapatos
            [color] => Negro

            [precio] => 50
        )


)

Buscar un dato en una columna determinada


Array_search es una función de PHP para buscar en un array y devuelve laposicion o la clave donde se encuentra el dato.

Ejemplo
echo "<pre>";


// Obtener una lista de columnas

$datos=$_SESSION['carrito'];
//obtenenemos los datos de una columna

$productos = array_column($_SESSION['carrito'], 'producto');

$clave = array_search('Camisa', $productos);
echo "El producto camisa Existe con ID: ".$clave;


echo "</pre>";
El resultado será el siguiente:

El producto camisa Existe con ID: 1

Añadir elementos al final de una matriz


La función array_push añade uno o más elementos al final de una matriz
echo "<pre>";

// Obtener una lista de columnas
$datos=$_SESSION['carrito'];

//Array con datos a añadir
$nuevacompra =  array('cantidad'=>1, 'producto'=>'Remera','color'=>'Verde','precio'=>20.00,'stock'=>5);


//Añadimos los datos nuevos al array

array_push($datos, $nuevacompra);

print_r($datos);
echo "</pre>";
El resultado será el siguiente:
Array
(

    [1] => Array
        (

            [cantidad] => 2
            [producto] => Pantalón

            [color] => AZUL
            [precio] => 60

            [stock] => 0
        )


    [2] => Array

        (
            [cantidad] => 2

            [producto] => Camisa
            [color] => Rojo

            [precio] => 70
            [stock] => 5

        )

    [3] => Array
        (

            [cantidad] => 1
            [producto] => Zapatos

            [color] => Negro
            [precio] => 50

            [stock] => 1
        )


    [4] => Array

        (
            [cantidad] => 1

            [producto] => Remera
            [color] => Verde

            [precio] => 20
            [stock] => 5

        )

)

Quitar un elemento de una matriz


La función unset nos permite en PHP eliminar datos como sesiones y vaciar variables, en este caso lo usaremos para eliminar elementos de una matriz por ejemplo.
echo "<pre>";


// Obtener una lista de columnas

$datos=$_SESSION['carrito'];
//Eliminar elemento con 2

unset($datos[2]);
print_r($datos);

echo "</pre>";
Si queremos borrar todos los elementos de la matriz utilizamos:
unset($datos);
Esta misma función se utiliza para borrar la session una vez pagada la compra y guardado los datos:
unset($_SESSION[carrito]);

matrices-avanzado6.jpg


Determinar la posición actual y moverse dentro de una matriz:
echo "<pre>";


// Obtener una lista de columnas

$datos=$_SESSION['carrito'];

// Posición actual
echo 'Posicion actual<br>';

$posicion = current($datos);
print_r($posicion);


echo '<br><br>Proxima posición<br>';

$proxima_posicion= next($datos);

echo '<br><br>Proxima posición ';

print_r($proxima_posicion);

echo "</pre>";
  session_unset();

session_destroy();

?>
Otras funciones para moverse dentro de una matriz


Moverse al elemento anterior al actual
$anterior_posicion= prev($datos);

También moverse al ultimo elemento de la matriz

$ultimo= end($datos);
Moverse al primer elemento de la matriz
$primero = reset($datos);
Así de esta manera nos podemos mover fácilmente por la matriz como si fuera un Dataset en otros lenguajes.

Implementar un carrito de compras con MySQL y Matrices

Vamos a crear un carrito de compras en PHP para entender como funcionan los array, creamos primero una base de datos, tienda y una tabla catálogo.
--

-- Estructura de tabla para la tabla `catalogo`
--


CREATE TABLE IF NOT EXISTS `catalogo` (

  `id` int(11) NOT NULL,
  `producto` varchar(100) DEFAULT NULL,

  `precio` decimal(9,2) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;


Insertamos algunos datos para nuestro ejemplo


INSERT INTO `catalogo` (`id`, `producto`, `precio`) VALUES

(1, 'Pantalón', '50.00'),
(2, 'Camisa', '40.00'),

(3, 'Zapatos', '30.00')
Crearemos luego el archivo catalogo.php para mostrar los productos, la interfaz será la siguiente:

matrices-avanzado7.jpg


Los iconos serán los siguientes:

Visualizar las compras en el carrito
matrices-avanzado8.jpg

Añadir productos al carrito
matrices-avanzado9.jpg

Copiamos el siguiente código en el archivo catalogo.php
<? session_start();

//conectamos a la base de datos
mysql_connect("localhost","root","");

mysql_select_db("tienda");

//Verificamos si el carrito contiene datos,
//si contiene asignamos la sesion en la matriz carrito

if(isset($_SESSION['carrito'])) {
$carrito=$_SESSION['carrito'];

} else {
$carrito=false;

}
?>

<html>
<head>

<title>Catalogo de Productos</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head>
<body>

<table width="350px" align="center" cellpadding="3" cellspacing="0" style="border: 1px solid #000000;">
<tr valign="middle" bordercolor="#000" bgcolor="#B7F68A" >

<td width="150"><strong>Producto</strong></td>
<td width="100"><strong>Precio</strong></td>

<td width="100" align="right"><a href="vercarrito.php" title="Ver mis compras">
<img src="boton.png" width="150" height="46" border="0"></a></td>

</tr>
<?php

//consultamos la base de datos
$rscatalogo=mysql_query("select * from catalogo ***** by producto asc");


//mostramos todos los productos

$i=0;
while($fila=mysql_fetch_assoc($rscatalogo)){

$i++;
//Si la fila es impar pongo color gris

//sino blanco
if($i%2!==0) {

  $bgcolor="#f8f8f8";
} else {

  $bgcolor="#ffffff";
}

?>
<tr valign="middle" bgcolor="<? echo $bgcolor ?>">

<td><?php echo utf8_encode($fila['producto']) ?></td>
<td><?php echo $fila['precio'] ?></td>

<td align="center">
<?php

if(!$carrito || !isset($carrito[$fila['id']]) || $carrito[$fila['id']]!=$fila['id']){
//verificamos que el producto esta en la base de datos

?>
<a href="agregarcompra.php?id=<?php echo $fila['id']; ?>">

<img src="agregar.png" width="23" height="19" border="0" title="Agregar al Carrito"></a></td>
</tr>

<?php }
} ?>

</table>
<br><br>

//Limpiamos el carrito
<a href="index.php?borrar=1">Borrar</a>

</body>
</html>

<?php
ob_end_flush();


if ($_GET['borrar']==1) {

session_unset();
session_destroy();

}
?>
El resultado de ejecutar en un navegador será la pantalla anterior:

matrices-avanzado10.jpg


A continuación crearemos el archivo agregarcompra.php que sera el que reibe el link con el id del producto y lo añade al carrito mediante la sesion y el array.
<?php

session_start();
//iniciamos la sesión, si ya estaba iniciada la retomamos


//conectamos a la base de datos

mysql_connect("localhost","root","");
mysql_select_db("tienda");


//Verificamos la cantidad de productos en el carrito

//si es cero entonces ponemos uno
if(!isset($cantidad)){$cantidad=1;}

//Tomamos el id del producto seleccionado
$id=$_GET['id'];


//consultamos el catalogo para determinar cual es el producto

$rscatalogo=mysql_query("select * from catalogo where
id=".$id);

$fila=mysql_fetch_array($rscatalogo);

//Verificamos si la sesion carrito tiene datos o esta vacia

if(isset($_SESSION['carrito']))
//si tiene datos los asignamos a un array

$carrito=$_SESSION['carrito'];

//Ahora insertamos el nuevo producot en la matriz
//Si el producto id existe le sumamos 1


$cantidad=$carrito[$id]['cantidad']+1;

//Lo añadimos si no existe o actualizamos si existe

$carrito[$id]=array($id,
'cantidad'=>$cantidad,'producto'=>$fila['producto'],

'precio'=>$fila['precio'],'id'=>$id);

//Actualizamos la sesion carrito on la matriz
$_SESSION['carrito']=$carrito;


//Enviamos a ver el carrito con las modificaciones

header("Location:vercarrito.php");
?>
A continuacion nos queda el archivo vercarrito.php donde deberemos cmostrar y calcular las cantidades y los importes a pagar
<?php

session_start();
//Iniciamos o retomamos la

//sesión
if(isset($_SESSION['carrito']))

$carrito=$_SESSION['carrito'];else $carrito=false;
//La asignamos a la variable

//$carro si existe o ponemos a false $carro
//en caso contrario


?>
<html>

<head>
<title>PRODUCTOS AGREGADOS AL CARRITO</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">

body {
    font-size: 12px;

    color: #0000;
}

.encabezados {
    font-size: 12px;

    color: #ffffff;
}


</style>


</style>

</head>
<body>

<h1 align="center">Mis compras</h1>
<?php

if($carrito){
//si el carro no está vacío,

//mostramos los productos
?>

<table width="720" border="0" cellspacing="0" cellpadding="2" align="center" style="font-size:15px">
<tr bgcolor="#333333" class="encabezados">

<td width="105">Producto</td>
<td width="207">Precio</td>

<td colspan="2" align="center">Cantidad de Unidades</td>
</tr>

<?php
//cambiar los colores segun la fila sea par o impar

$bgcolor=array("#ffffff","#F0F0F0");
//incializamos variables

$colorfila=0;
$importetotal=0;

$cantproductos=0;

//Recorremos la matriz carrito para extraer los datos
foreach($carrito as $clave => $fila) {


//calculamos la cantidad de productos y el importe total


$importe_subtotal=$fila['cantidad']*$fila['precio'];

$importetotal=$importetotal+$importe_subtotal;
$cantproductos=$cantproductos+$fila['cantidad'];

$colorfila++;
//colorfila lo usamos para cambiar los colores

?>
<tr bgcolor="<?php echo $bgcolor[$colorfila%2]; ?>" '>

<td><?php echo utf8_encode($fila['producto']) ?></td>
<td><?php echo $fila['precio'] ?></td>

<td width="43" align="center"><?php echo $fila['cantidad'] ?></td>

</tr><? } ?>
</table>


<!--   Mostramos la cantidad de productos -->

<div align="center"><span>Total de Productos: <? echo $cantproductos; ?></span>
</div><br>


<!--   Mostramos el importe a pagar -->

<div align="center">Importe a Pagar: <?php echo number_format($importetotal,2);
?></div><br>

<div align="center"><a href="index.php">Volver a Productos</a>

</div>
<?php }else{ ?>

<p align="center"><a href="index.php">No has realizado compras</a>

<?php }?></p>
</body>

</html>

matrices-avanzado11.jpg


Conclusión
El carrito de compras es sencillo, no tiene grandes funcionalidades, ni complejidad, para entender como funcionan las matrices y como podemos utilizarlas, este caso es solo una de todas las aplicaciones que podemos implementar.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X