Tengo estas 2 matrices y necesito reemplazar los índices numéricos de $productos con los índices de $columnas.
No sé si es correcto resolverlo con "bucle foreach" o con otra función de PHP.
PROBLEMA: el array devuelto debe tener el mismo número de elementos que el inicial.
$columnas = array( "CATEGORIA", "PRODUCTO", "IMAGEN", "PRECIO", "DESCUENTO", "DISPONIBLE"); $products = array( array( "Burgers", "Doble con queso", "burger.jpg","300" ), array( "Burgers", "Triple", "burger_triple.jpg", "350", "10%", "si" ), array( "Burgers", "Triple2", "burger_triple.jpg", "380" ), array( "Burgers", "Triple3" ), );En el ciclo, reviso ambas matrices para reemplazar los índices.
foreach( $products as $k => $product ) { foreach($product as $t => $y){ $columnsArray[$columnas[$t]] = $y; // $product[$columnas[$t]] = $y; // Other option } $newProducts[] = $columnsArray; } print_r($newProducts);Este es el resultado:
Array ( [0] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Doble con queso [IMAGEN] => burger.jpg [PRECIO] => 300 ) [1] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple [IMAGEN] => burger_triple.jpg [PRECIO] => 350 [DESCUENTO] => 10% [DISPONIBLE] => si ) [2] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple2 [IMAGEN] => burger_triple.jpg [PRECIO] => 380 [DESCUENTO] => 10% <------- should not be [DISPONIBLE] => si <------- should not be ) [3] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple3 [IMAGEN] => burger_triple.jpg <------- should not be [PRECIO] => 380 <------- should not be [DESCUENTO] => 10% <------- should not be [DISPONIBLE] => si <------- should not be ) )Parece que esto es lo que buscas
$data = []; foreach ($products as $k => $product) { $result = []; foreach ($columnas as $i => $key) { $result[$key] = (isset($product[$i]) ? $product[$i] : null); } $data[] = $result; } print_r($data);El problema con su versión era que no estaba creando una matriz limpia dentro del ciclo, por lo que los valores faltantes permanecerían de la iteración anterior.
Debe comenzar cada iteración del foreach anidado con un $columnsArray vacío
Tenga en cuenta que está haciendo un bucle en una matriz de productos y utilizando esas claves numéricas para indexar directamente en la matriz $columnas .
Esto puede causar una clave de matriz indefinida si hay más productos que columnas.
foreach( $products as $k => $product ) { $columnsArray = []; foreach($product as $t => $y){ if (array_key_exists($t, $columnas)) { $columnsArray[$columnas[$t]] = $y; } } $newProducts[] = $columnsArray; } print_r($newProducts);Producción
Array ( [0] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Doble con queso [IMAGEN] => burger.jpg [PRECIO] => 300 ) [1] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple [IMAGEN] => burger_triple.jpg [PRECIO] => 350 [DESCUENTO] => 10% [DISPONIBLE] => si ) [2] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple2 [IMAGEN] => burger_triple.jpg [PRECIO] => 380 ) [3] => Array ( [CATEGORIA] => Burgers [PRODUCTO] => Triple3 ) )<?php $columnas = array( "CATEGORIA", "PRODUCTO", "IMAGEN", "PRECIO", "DESCUENTO", "DISPONIBLE"); $products = array( array( "Burgers", "Doble con queso", "burger.jpg","300" ), array( "Burgers", "Triple", "burger_triple.jpg", "350", "10%", "si" ), array( "Burgers", "Triple2", "burger_triple.jpg", "380" ), array( "Burgers", "Triple3" ), ); $newProducts = []; foreach ($products as $p) { // slice out the same number of keys from $columnas, combine into the new array $newProducts[] = array_combine(array_slice($columnas,0,count($p)),$p); } print_r($newProducts);