Bucles de matriz anidados de PHP con actualización de matriz
Frecuentes
Visto 102 equipos
1
Soy de un VB; Acceso; Antecedentes de SQL Server introducidos recientemente en WAMP. Tengo un problema que no he podido resolver desde hace unas semanas, creo que he visitado todos los foros de la web (incluido este) sin éxito.
Tengo dos arreglos llenos de conjuntos de registros MySQL, uno para el carrito del sitio y el otro para uno de los departamentos del sitio (catálogos). Vea una interpretación manual de los arreglos llenos a continuación.
$catalog[] = array(
array('ProdID'=>2,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
array('ProdID'=>6,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
array('ProdID'=>7,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
array('ProdID'=>8,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
array('ProdID'=>9,'Name'=>'Alpha','DepID' =>2,'InBasket'=>'0'),
);
$cart[] = array(
array('Name'=>'Alpha2','Loc'=>'e_vol1','BasketID'=>'81','ProdID'=>'2','Quant'=>'1'),
array('Name'=>'Beta4','Loc'=>'e_vol2','BasketID'=>'81','ProdID'=>'4','Quant'=>'1'),
array('Name'=>'Alpha8','Loc'=>'e_vol3','BasketID'=>'81','ProdID'=>'8','Quant'=>'1'),
array('Name'=>'Gamma21','Loc'=>'e_vol4','BasketID'=>'81','ProdID'=>'21','Quant'=>'1'),
);
Lo que debo hacer es recorrer la matriz del catálogo cada vez que se elige un nuevo catálogo, comparando el ProdID de cada fila en el carrito con el ProdID de cada fila del catálogo, cuando se encuentra una coincidencia, me gustaría actualizar el catálogo. El valor 'En la cesta' para esa fila solo en '1' para indicar que el artículo ya está en el carrito del cliente que luego puedo mostrar en la pantalla (el cliente solo puede comprar uno de cualquier artículo).
Hay cinco departamentos diferentes (catálogos) que contendrán hasta 10 productos, el carrito contendrá, digamos, cuatro artículos (si tengo suerte)
He probado algunos bucles pero parece que no funcionan.
for ($x = 0; $x < count($catalog); $x++)
{
for ($y = 0; $y < count($cart); $y++)
{
If ($catalog[$x]['ProductID'] == $cart[$y]['ProductID'] )
{
$cart[$x]['InBasket'] = 1;
}
}
}
Espero que mis matrices sean correctas, pero los bucles parecen actualizar 'InBasket' independientemente.
Cualquier idea sería apreciada.
4 Respuestas
4
Tu $cart
tiene una clave de matriz llamada ProdID
, pero está intentando utilizar ProductID
que no existe. Entonces, está intentando actualizar el InBasket
clave de la $cart
subarreglos, cuando en realidad, es un miembro de la $catalog
formación.
Lo primero es lo primero:
Deshazte de esos bucles incrementales. En PHP, usamos mucho más típicamente foreach
para iteración, que es mucho más legible:
foreach ($catalog as &$catalog_item) {
foreach($cart as $cart_item) {
if ($catalog_item['ProductID'] == $cart_item['ProdID']) {
// The InBasket key is part of the catalog, not the cart!
$catalog_item['InBasket'] = 1;
}
}
}
Respondido el 20 de junio de 20 a las 10:06
Gracias por tu respuesta, muy apreciada. Cuando revisé la pregunta más tarde, me di cuenta de ProdID - ProductID (error humano), sin embargo, la información de foreach era lo que estaba buscando. - johncron
Desde mi última respuesta, probé su código con mis arreglos y el 'campo' de InBasket no está actualizado. ¿Ejecutaste tu propio código? - johncron
@johncron acabo de notar que tienes un extra []
en las definiciones de su matriz, lo que las convierte en 3 niveles en lugar de 2. Cámbielas de $catalog[] = array(...)
a $catalog = array(...)
. - Michael Berkowski
@johncron Además, necesita una referencia de matriz. Ver el &
agregado en el ciclo foreach externo arriba ... Lo probé y funciona: los productos 2 y 8 se actualizan correctamente. - Michael Berkowski
2
En su ejemplo, el ID del producto en ambas tablas es ProdID
; está comprobando 2 elementos de matriz indefinidos/vacíos (que serán iguales).
if ($catalog[$x]['ProdID'] == $cart[$y]['ProdID'] )
Respondido 31 Jul 12, 14:07
0
La sintaxis de su ejemplo de matriz es incorrecta:
$catalog[] = array('whatever');
Esto significa que la matriz con lo que sea se incluirá en otra matriz.
Ver este ejemplo: http://codepad.org/OMbnEEjA Entonces verás la diferencia.
Respondido 31 Jul 12, 14:07
Gracias por esta información, sin embargo, el enlace produjo un error interno del servidor. - johncron
0
Varios problemas:
está utilizando el nombre de clave incorrecto:
If ($catalog[$x]['ProductID'] == $cart[$y]['ProductID'] )
cambiarlo a
If ($catalog[$x]['ProdID'] == $cart[$y]['ProdID'] )
en el segundo bucle que estás haciendo:
$cart[$x]['InBasket'] = 1;
pero usted indicó en la pregunta que le gustaría actualizar el catálogo, por lo que debería ser:
$catalog[$x]['InBasket'] = 1;
Debe usar el método sugerido por @jicd para hacer un bucle, es mucho más fácil.
vea aquí para obtener más información sobre cómo usar foreach
.
Respondido 31 Jul 12, 14:07
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php or haz tu propia pregunta.
Deberías estar usando el
foreach()
comando, en lugar de la instrucción for, que es típica de VB. - Sablefoste¿No debería ser $catalog[$x]["inBasket"] = 1 ? - take