¿QUÉ ES SPLPRIORITYQUEUE EN PHP?

SplPriorityQueue es una clase de la Standard PHP Library, SPL, que implementa una cola de prioridad, Priority Queue.
  • Es una estructura de dato heap donde cada elemento tiene una prioridad.
  • Al extraer elementos, siempre se obtiene primero el de mayor prioridad.
  • Internamente está implementada como un Max-Heap.
Las diferencia con una cola normal SplQueue son:
  • En una cola normal (FIFO): primero entra → primero sale.
  • En SplPriorityQueue: sale primero el elemento con mayor prioridad, independientemente del orden de inserción.

Métodos más utilizados

  • insert($value, $priority): Inserta un elemento con su prioridad.
  • extract(): Extrae y elimina el elemento con mayor prioridad.
  • top(): Muestra el elemento de mayor prioridad sin eliminarlo.
  • isEmpty(): Devuelve true si la cola está vacía.
  • count(): Devuelve la cantidad de elementos en la cola.
  • setExtractFlags(): Permite configurar qué se devuelve al hacer extract() (valor, prioridad o ambos).

Ejemplo (MAx-Heap)

$queue = new SplPriorityQueue();

// insert(valor, prioridad)
$queue->insert("Tarea A", 10);   // prioridad media
$queue->insert("Tarea B", 5);    // prioridad baja
$queue->insert("Tarea C", 20);   // prioridad alta
$queue->insert("Tarea D", 15);

echo $queue->extract(); // → Tarea C (prioridad 20)
echo $queue->extract(); // → Tarea D (prioridad 15)
echo $queue->extract(); // → Tarea A (prioridad 10)
echo $queue->extract(); // → Tarea B (prioridad 5)

//Salida
Procesando: Alerta de seguridad
Procesando: Procesar pago fallido
Procesando: Enviar email de bienvenida

Crear un Min-Heap (prioridad mínima)

Como SplPriorityQueue es un Max-Heap, si se quiere que salga primero el elemento con menor valor (por ejemplo, el número más pequeño), se pueden usar prioridades negativas:

$queue = new SplPriorityQueue();

$queue->insert("Elemento A", -10);   // menor número = mayor prioridad negativa
$queue->insert("Elemento B", -5);
$queue->insert("Elemento C", -25);

echo $queue->extract(); // → Elemento C (-25)
Otro ejemplo de Min-Heap

// ==================== MIN HEAP (menor valor primero) ====================
$minHeap = new SplMinHeap();

$minHeap->insert(10);
$minHeap->insert(30);
$minHeap->insert(5);
$minHeap->insert(25);

echo "\n\nMinHeap - Extrayendo en orden ascendente:\n";
while (!$minHeap->isEmpty()) {
    echo $minHeap->extract() . " ";
}
// Salida: 5 10 25 30

Ventajas

  • Muy eficiente para manejar prioridades.
  • Implementada en C (rápida).
  • No requiere instalar extensiones adicionales.
  • Ideal cuando se necesita procesar elementos en orden de importancia.

Desventajas

  • No permite actualizar fácilmente la prioridad de un elemento que ya está en la cola ya que no tiene método "decreaseKey" nativo.
  • En algunos casos se insertan elementos duplicados para simular actualizaciones de prioridad.

Usos Comunes de SplPriorityQueue en PHP

Uso Principal Descripción / Para qué sirve
Sistemas de Tareas y Jobs Procesar tareas en orden de prioridad (urgentes primero)
Colas de Notificaciones Enviar notificaciones críticas antes que las informativas
Sistemas de Atención al Cliente Gestionar tickets de soporte (críticos, altos, medios, bajos)
Procesamiento de Pedidos en E-commerce Procesar primero los pedidos de clientes VIP o pagos ya confirmados
Sistemas de Impresión o Envío Imprimir o enviar documentos según prioridad (facturas urgentes primero)
Algoritmos de Planificación Planificar eventos, reuniones, envíos o mantenimientos
Background Workers / Queues Mejorar Laravel Horizon, Symfony Messenger o colas personalizadas
Juegos y Simulaciones Procesar acciones de jugadores según prioridad (ataques, movimientos, etc.)
Sistemas de Logging Inteligente Guardar logs de error primero, luego warnings y finalmente info
Optimización de Recursos Asignar servidores, CPU o conexiones a las solicitudes más importantes primero