Newsgroup: it.comp.www.php
Titolo: trasformazione da array di records a array raggruppati

ciao a tutti,
sto cercando di capire come meglio fare trasformare da un array di
records che ottengo da un database (con una query), in un array di
array ottenuto raggruppando i record in base al valore di uno dei
campi.
Per ora ho fatto un accrocco di cicli for e variabili di controllo, ma
non mi piace, stavo cercando in rete se c'è un qualche pattern o
funzione esistente che per lo meno aiuto in questa cosa. Mi sapreste
dare qualche consiglio ?
I record in ingresso a questo "algoritmo" sono:
$records = array (
    array ('title' => 'guida uno', 'abstract' => 'abstract guida uno',
'category_name' => 'categoria_uno', 'category_description' =>
'categoria uno'),
    array ('title' => 'guida due', 'abstract' => 'abstract guida due',
'category_name' => 'categoria_uno', 'category_description' =>
'categoria uno'),
    array ('title' => 'guida tre', 'abstract' => 'abstract guida tre',
'category_name' => 'categoria_uno', 'category_description' =>
'categoria uno'),
    array ('title' => 'guida uno', 'abstract' => 'abstract guida uno',
'category_name' => 'categoria_due', 'category_description' =>
'categoria due'),
    array ('title' => 'guida quattro', 'abstract' => 'abstract guida
quattro', 'category_name' => 'categoria_due', 'category_description'
=> 'categoria due'),
    array ('title' => 'guida quattro', 'abstract' => 'abstract guida
quattro', 'category_name' => 'categoria_tre', 'category_description'
=> 'categoria tre'),
    array ('title' => 'guida cinque', 'abstract' => 'abstract guida
cinque', 'category_name' => 'categoria_tre', 'category_description' =>
'categoria tre'),
    array ('title' => 'guida sei', 'abstract' => 'abstract guida sei',
'category_name' => 'categoria_quattro', 'category_description' =>
'categoria quattro')
);
E questo è il risultato che vorrei ottenere:
$groups = array (
   array (
       'category_name' => 'categoria_uno',
       'category_description' => 'categoria uno',
       'guides' => array (
                       array ('title' => 'guida uno', 'abstract' =>
'abstract guida uno'),
                       array ('title' => 'guida due', 'abstract' =>
'abstract guida due'),
                       array ('title' => 'guida tre', 'abstract' =>
'abstract guida tre')
                   )
   ),
   array (
       'category_name' => 'categoria_due',
       'category_description' => 'categoria due',
       'guides' => array (
                       array ('title' => 'guida uno', 'abstract' =>
'abstract guida uno'),
                       array ('title' => 'guida quattro', 'abstract'
=> 'abstract guida quattro'),
                   )
   ),
   array (
       'category_name' => 'categoria_tre',
       'category_description' => 'categoria tre',
       'guides' => array (
                       array ('title' => 'guida quattro', 'abstract'
=> 'abstract guida quattro'),
                       array ('title' => 'guida cinque', 'abstract' =>
'abstract guida cinque')
                   )
   ),
   array (
       'category_name' => 'categoria_quattro',
       'category_description' => 'categoria quattro',
       'guides' => array (
                       array ('title' => 'guida sei', 'abstract' =>
'abstract guida sei')
                   )
   )
);

 campi.
<snip>
mi è capitato parecchie volte, non credo ci sia molto da fare...
l'unica penso sia aggiungere un campo univoco per ogni categoria (ad
esempio l'id della categoria, il nome, ecc...) ed aggiungerlo
all'array-categoria nell'array-groups, cioè:
$groups = array
  $id_categoria => array (
       'category_name' => 'categoria_uno',
       'category_description' => 'categoria uno',
       'guides' => array (
                       array ('title' => 'guida uno', 'abstract' =>
'abstract guida uno'),
                       array ('title' => 'guida due', 'abstract' =>
'abstract guida due'),
                       array ('title' => 'guida tre', 'abstract' =>
'abstract guida tre')
                   )
   ),
...
in questo modo, quando ti cicli i record delle categorie, puoi
effettuare il controllo:
ciclo_dei_record()
{
        /* non esiste già un array per la categoria $id_categoria?  */
        if(! array_key_exists($id_categoria, $groups)
        {
            /* non esiste allora lo creo (vuoto) */
            $groups[$id_categoria] = array();
        }
        /* aggiungo una categoria, tanto sono sicuro che l'array
dentro $groups esiste di già */
        $groups[$id_categoria][] = array(......);
}
d

 effettuare il controllo:
grazie mille è una buona soluzione e si ottiene codice più pulito e
sintentico della mia prima versione! :-)