Portada » Lenguaje PHP » Categorías infinitas dinámica con PHP y MySQL

Categorías infinitas dinámica con PHP y MySQL

Categorías infinitas dinámica de varios niveles con PHP y MySQL. En este articulo mostraremos un script para generar categorías infinitas con una sola tabla MySQL y PHP.

¿Cómo construir una categoría anidada dinámica infinita?

Se puede crear de varios niveles con PHP y servidor MySQL. Aquí mostraré un ejemplo de nivel infinito de categorías y subcategorías usando una base de datos MySQL.

Así que voy a dar un ejemplo sobre la categoría anidada multinivel infinito con PHP y MySQL.

Requisitos previos para crear categoría infinita

  • MySQL 8.0.17 – 8.0.26
  • PHP 7.4.3 – 7.4.27
  • Apache 2.4

Categorías infinitas dinámica: Configuración

En primera instancia se supone que ha configurado Apache y PHP en el sistema Windows.

Ahora crearemos un directorio raíz del proyecto llamado CATEGORIA_INFINITA en la carpeta htdocs del servidor Apache.

Pasos para crear categorías infinitas dinámica

A continuación, detallaremos los pasos para lograr nuestro objetivo.

Primer paso: Creación de tabla MySQL

Primero debe crear una tabla llamada «categorías» en la base de datos de nombre «multiple_categorias» en el servidor MySQL porque queremos crear la categoría anidada de varios niveles a partir de la tabla de base de datos.

Para crear la base de datos e importar la tabla podemos usar la herramienta PHPMyAdmin, a continuación, la tabla categorías infinitas.

CREATE TABLE `categorias` (
`category_id` int unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(50) NOT NULL,
`category_link` varchar(255) NOT NULL,
`parent_id` int unsigned NOT NULL DEFAULT '0',
`sort_order` int NOT NULL DEFAULT '0',
PRIMARY KEY (`category_id`),
UNIQUE KEY `unique` (`category_name`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Análisis de la tabla creada

Hemos creado la estructura de la tabla de categorías. Esta tabla de categorías tiene un identificador de categoría principal que identifica la categoría principal de este elemento secundario.

Si en la columna parent_id hay 0, asumiremos que esta categoría es la categoría de nivel superior.

La tabla tiene las siguientes cinco columnas:

category_id: Valor int positivo incrementado automáticamente, la clave principal también
category_name: Nombre o nivel de la categoría visible, la clave única
category_link:  URL para esta categoría
parent_id: Identifica quién es el padre de esta categoría. Para la categoría raíz, el parent_id es 0.
sort_order:  El orden de las categorías

Segundo paso: Importar datos a la tabla categorías

En el punto anterior hemos creado la tabla categorías. Por lo tanto, ahora para probar la aplicación una vez que esté terminada, necesita algunos datos en ella. importaremos los siguientes registros a la tabla.

insert into `categorias`(`category_id`,`category_name`,`category_link`,`parent_id`,`sort_order`) values 
(1,'Home','',0,0),
(2,'Tutorials','#',0,1),
(3,'Java','java',2,1),
(4,'Liferay','liferay',2,1),
(5,'Frameworks','#',0,2),
(6,'JSF','jsf',5,2),
(7,'Struts','struts',5,2),
(8,'Spring','spring',5,2),
(9,'Hibernate','hibernate',5,2),
(10,'Webservices','#',0,3),
(11,'REST','rest',10,3),
(12,'SOAP','soap',10,3),
(13,'Contact','contact',0,4),
(14,'About','about',0,5);

Tercer paso: Obtener datos de la tabla

En este punto usaremos una consulta SQL para poder mostrar el contenido de la tabla MySQL. Sin embargo, en la consulta SQL tenemos que declarar las columnas que deseamos visualizar, por ejemplo: category_id, category_name, category_link, parent_id y sort_order para construir la categoría anidada infinita de varios niveles usando PHP y MySQL.

SELECT
`category_id`,
`category_name`,
`category_link`,
`parent_id`,
`sort_order`
FROM categorias
ORDER BY parent_id, sort_order, category_name;

Aquí está el resultado final después de ejecutar la consulta anterior:

Consulta sql categorias multinivel
Consulta sql categorias multinivel

Cuarto paso: Creación de jerarquía padre-hijo

Primero realizaremos la conexión de PHP con MySQL para que podamos realizar las consultas sin inconvenientes.

La siguiente lógica recupera los resultados de la tabla de categorías y coloca los resultados en una matriz multidimensional.

La matriz $category contiene otras dos matrices, las categorías contienen todos los resultados de la consulta de la tabla de categorías y la matriz parent_cats contiene una lista de todos los identificadores de categoría que tienen hijos.

Quinto paso: Ciclo while

A continuación, usamos una instrucción while para ejecutar los resultados de sql y asignar una fila a las matrices.

Si el identificador primario de la fila ya existe en la matriz parent_cats, se sobrescribirá, por lo que solo aparecerá uno de cada identificador primario en la lista.

$dbConn = mysqli_connect('localhost', 'root', 'root', 'mis_datos') or die('MySQL connect failed. ' . mysqli_connect_error());

//select all rows from the category table
$result = mysqli_query($dbConn, "SELECT
category_id, category_name, category_link, parent_id, sort_order
FROM categorias
ORDER BY parent_id, sort_order, category_name");

//create a multidimensional array to hold a list of category and parent category
$category = array(
'categories' => array(),
'parent_cats' => array()
);

//build the array lists with data from the category table
while ($row = mysqli_fetch_assoc($result)) {
//creates entry into categories array with current category id ie. $categories['categories'][1]
$category['categories'][$row['category_id']] = $row;
//creates entry into parent_cats array. parent_cats array contains a list of all categories with children
$category['parent_cats'][$row['parent_id']][] = $row['category_id'];
}

Sexto paso: Función buildCategory

Ahora debemos de crear la función de categoría y subcategoría que mostrará los resultados finales para la categoría anidada multinivel infinito.

En la siguiente función asumimos que el identificador de categoría principal tiene un valor 0 y es la categoría de nivel superior y todas las demás categorías caen dentro de esa categoría principal.

Aquí usamos la función recursiva para construir la categoría anidada multinivel infinita. La lógica es simplemente verificar si hay alguna categoría secundaria y luego llamar a la función recursivamente, de lo contrario, escriba la categoría en el padre o escriba como una categoría principal.

function buildCategory($parent, $category) {
$html = "";
if (isset($category['parent_cats'][$parent])) {
$html .= "<ul>\n";
foreach ($category['parent_cats'][$parent] as $cat_id) {
if (!isset($category['parent_cats'][$cat_id])) {
$html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a>\n</li> \n";
}
if (isset($category['parent_cats'][$cat_id])) {
$html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a> \n";
$html .= buildCategory($cat_id, $category);
$html .= "</li> \n";
}
}
$html .= "</ul> \n";
}
return $html;
}

Séptimo paso: Usar la función

Una vez que haya terminado de crear la función anterior, debemos de saber cómo usarla. Por lo tanto, si desea usar la función debe usar el código que a continuación y debe llamar donde quiera mostrar (principalmente en el área del menú) la categoría infinita de varios niveles.

Detalle de uso

Muestre el resultado con el siguiente ejemplo:

echo buildCategory(0, $category);

Resultado final

Salida final en el navegador presionando la URL http://localhost/CATEGORIA_INFINITA/vategoria_infinita.php en el navegador:

Categoria infinita
Categoria infinita

Conclusión

En este articulo hemos aprendido a implementar una secuencia de categorías infinitas, es decir categoría padre, categoría hijo y así sucesivamente usando una tabla MySQL con el lenguaje PHP.

Si desean pueden incorporar un CRUD para gestionar las categorías usando métodos GET o método POST

Hemos usado una función para disponer de las categorías. Además, hemos usado el ciclo FOREACH y ciclo WHILE

Espero que con esta explicación tengas una idea y puedas construir una categoría y subcategoría anidada multinivel infinita.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 2

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio
Esta web utiliza cookies propias para su correcto funcionamiento. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Privacidad