Tengo un producto con variantes opcionales como este:
SANDALIAS
cada variante de producto está relacionada con un conjunto de selecciones. Ejemplo: si selecciono Color: rojo, Tamaño: grande, Marca: brandX, esto se relacionará con un producto con una identificación de 820.
La forma en que debería verse el árbol de opciones es esta:
"optionTree": [ [ 0, 0, [ 820, 0 ] ], [ 0, [ 0, 821 ], [ 823, 0 ] ], [ [ 824, 825 ], 0, 0 ] ]Como puede verse, hay 3 opciones de productos para elegir, por lo que la profundidad del árbol es de 3 de profundidad. cada nivel de la matriz se relaciona con una opción de producto. La primera profundidad se ocupa del Color , la segunda se ocupa del Tamaño y la tercera de la Marca (podría haber un número variable de opciones, no solo 3). Por lo tanto, recorrer toda la matriz hasta el final dará como resultado una identificación de producto que coincida con las 3 opciones. (el índice de las opciones se relaciona con los índices en la matriz 'optionTree', también se usan 0 para representar callejones sin salida)
Pregunta: ¿Cómo ordeno variantes de selección de productos en un árbol de matriz de tal manera que se relacionen con sus respectivas opciones?
digamos que tengo una serie de productos que me gustaría insertar en un árbol vacío:
$products_to_add = [ [ "choices" => ['red', 'medium', 'brandX'], "product_id" => 820 ], [ "choices" => ['red', 'small', 'brandY'], "product_id" => 821 ], [ "choices" => ['green', 'small', 'brandX'], "product_id" => 822 ], [ "choices" => ['blue', 'large', 'brandY'], "product_id" => 823 ], ]¿Cómo transformaría la matriz anterior en un 'árbol de opciones' coherente como el que se mostró anteriormente? (php o javascript está bien)
Puede usar un bucle en el que muta el árbol final a medida que avanza. Antes de iniciarlo, puede preparar una estructura de ayuda que traduzca el nombre de una variante (como "red") a un índice en el (sub)arreglo relevante de la estructura de destino. En PHP:
$props = [ array_flip(["red", "green", "blue"]), array_flip(["small", "medium", "large"]), array_flip(["brandX", "brandY"]) ]; Luego, en el ciclo principal, puede beneficiarse de la asignación =& para hacer que un puntero recorra el árbol de resultados y agregue referencias null (prefiero esto que un 0) cuando llegue por primera vez a una rama determinada.
$optionTree = null; foreach($products_to_add as $product) { $node =& $optionTree; foreach ($product["choices"] as $depth => $name) { if ($node == null) $node = array_fill(0, count($props[$depth]), null); $node =& $node[$props[$depth][$name]]; } $node = $product["product_id"]; } unset($node); // Safety, since it is a reference Después de ejecutar este código, $optionTree tendrá el valor deseado.