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.
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.
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:
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); ?>
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>"; ?>
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]);
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(); ?>
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.
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:
Los iconos serán los siguientes:
Visualizar las compras en el carrito

Añadir productos al carrito

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:
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>