Como faço para agregar os resultados de uma lista de adjacência usando o SPL do PHP
-
27-09-2019 - |
Pergunta
Eu tentei usar conjuntos aninhados e eles se tornam muito difíceis de manter ao lidar com várias árvores e muitas outras complicações. Gostaria de dar uma facada à biblioteca SPL do PHP nisso (BTW, somos Php 5.3, MySQL 5.1 ).
Dado dois conjuntos de dados:
Os grupos:
+-------+--------+---------------------+---------------+
| id | parent | Category Name | child_key |
+-------+--------+---------------------+---------------+
| 11133 | 7707 | Really Cool Products| 47054 |
| 7709 | 7708 | 24" Monitors | 57910 |
| 7713 | 7710 | Hot Tubs | 35585 |
| 7716 | 7710 | Hot Dogs | 00395 |
| 11133 | 7707 | Really Cool Products| 66647 |
| 7715 | 7710 | Suction Cups | 08396 |
+-------+--------+---------------------+---------------+
Os itens
+------------+------------+-----------+----------+---------+
| child_key | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| 24171 | 10.50 | 20.10 | 200 | 100 |
| 35685 | 10.50 | 20.10 | 200 | 100 |
| 76505 | 10.50 | 20.10 | 200 | 100 |
| 04365 | 10.50 | 20.10 | 200 | 100 |
| 01975 | 10.50 | 20.10 | 200 | 100 |
| 12150 | 10.50 | 20.10 | 200 | 100 |
| 40060 | 10.50 | 20.10 | 200 | 100 |
| 08396 | 10.50 | 20.10 | 200 | 100 |
+------------+------------+-----------+----------+---------+
Os números são realmente muito mais complicados do que isso (na verdade estou agregando uma quantidade variável de meses ou anos nos últimos 15 anos; portanto, pode haver 20 colunas de resultados agregados).
EDITAR: @Gordon Suponho que existem várias maneiras de fazer o resultado do Results. , etc) já feito .. então o resultado seria algo assim (observe que a profundidade em uma lista de adjacência é arbitrária):
+------------+------------+-----------+----------+---------+
| Name | totalprice | totalcost | totalqty | onorder | (jan, feb, mar..)
+------------+------------+-----------+----------+---------+
| Monitors | 36.00 | 60.40 | 800 | 400 | (category)
| --24" | 22.00 | 40.20 | 400 | 200 | (category)
| ---04365 | 10.50 | 20.10 | 200 | 100 | (item)
| ---04366 | 11.50 | 20.10 | 200 | 100 | (item)
| --22" | 1.50 | 10.10 | 200 | 100 | (category)
| ---04365 | 1.50 | 10.10 | 200 | 100 | (item)
| -01234 | 12.50 | 10.10 | 200 | 100 | (item)
+------------+------------+-----------+----------+---------+
: End Edit
Eu tenho tentado descobrir RecursiveIterator e IteratorAggregate, mas estou tendo dificuldade em encontrar exemplos do mundo real que sejam genéricos o suficiente para realmente entender essas aulas.
Alguém pode me dar uma vantagem?
EDITAR:
Uma solução altamente detalhada não é necessária aqui. Parece não estar claro onde (se houver), eu posso utilizar o iterador, o recursivo,, o recursiveeratorIterator, etc. para criar uma solução limpa e escalável para agregar dados hierárquicos.
: End Edit
Solução
O que você realmente quer: código PHP mais agradável e mais curto ou solicitações mais otimizadas e rápidas? Se o seu caso for o último, você realmente deve procurar conjuntos aninhados, pois eles permitem que operações gerais em uma árvore (selecione todos os descendentes, mover ramo etc.) a serem feitos por uma única solicitação SQL.
Para exemplos concretos de implementação, tente o Google para a proposta "zend_db_nestetset". Possui suporte para árvores de "raiz múltipla", para que você possa teoricamente usar uma tabela para manter as relações hierárquicas genéricas para diferentes coleções de dados.