Newsgroup: it.comp.www.php
Titolo: array bidimensionale da query

Ciao a tutti,
scusate se ri-posto:
ho fatto qualche progresso ma non ho risolto del tutto il problema.
A seguito di una query, vorrei ottenere un array fatto così
(dove l'indice 3, ad esempio, contiene 3 array e l'indice 5 ne contiene 2)
Array ( [0] => Array ( [a] => aa [b] => ab [c] => ac )
         [1] => Array ( [a] => ba [b] => bb [c] => bc )
         [2] => Array ( [a] => ca [b] => cb [c] => cc )
         [3] => Array ( [0] => Array ( [a] => da [b] => db [c] => dc)
                        [1] => Array ( [a] => ea [b] => eb [c] => ec )
                        [2] => Array ( [a] => fa [b] => fb [c] => fc ) )
         [4] => Array ( [a] => ga [b] => gb [c] => gc )
         [5] => Array ( [0] => Array([a] => ha [b] => hb [c] => hc)
                        [1] => Array ( [a] => ia [b] => ib [c] => ic ) )
         [6] => Array ( [a] => la [b] => lb [c] => lc ) )
La differenza con questo array, che è l'array che sono riuscita ad 
ottenere, è che il primo elemento dell'array all'indice 3 non dovrebbe 
essere quello e gli altri due dovrebbero avere indice 1 e 2, non 0 e 1. 
Stesso discorso vale per l'indice 5:
Array ( [0] => Array ( [a] => aa [b] => ab [c] => ac )
         [1] => Array ( [a] => ba [b] => bb [c] => bc )
         [2] => Array ( [a] => ca [b] => cb [c] => cc )
         [3] => Array ( --->[a] => da [b] => db [c] => dc
                        --->[0] => Array ( [a] => ea [b] => eb [c] => ec )
                        --->[1] => Array ( [a] => fa [b] => fb [c] => fc ) )
         [4] => Array ( [a] => ga [b] => gb [c] => gc )
         [5] => Array ( --->[a] => ha [b] => hb [c] => hc
                        --->[0] => Array ( [a] => ia [b] => ib [c] => ic ) )
         [6] => Array ( [a] => la [b] => lb [c] => lc ) )
Partendo da una tabella così strutturata:
inner_id            d1           d2             d3
0                   g               sd            ds
1                   a                n             y
2                   b                o             w
3                   c                p             aa
3                   d                q             bb
3                   e                r             cc
4                   h                u             ff
5                   i                v             gg
5                   l                z             hh
6                    m               x            i
ho proceduto così:
<?php
mysql_connect("localhost", "root", "") or
    die("Connessione non riuscita: " . mysql_error());
mysql_select_db("new");
$risultato = mysql_query("SELECT inner_id,d1,d2,d3 FROM test");
$ext = array();
while ($riga = mysql_fetch_array($risultato, MYSQL_NUM)) {
// se nell'array $ext non c'è quell'indice, pusha l'array
if(!$ext[$riga[0]]){
array_push($ext,array("a"=>$riga[1],"b"=>$riga[2],"c"=>$riga[3]));
}
else
{
// se c'è pusha un "sub-array":
array_push($ext[$riga[0]],array("a"=>$riga[1],"b"=>$riga[2],"c"=>$riga[3]));
}
}
print_r ($ext);
?>
solo che questo modo di procedere fa sì che se, come nel nostro caso, 
gli inner_id con valore 3 siano più di uno, il ciclo entri prima nel 
primo if, scrivendo un dato che in altre circostanze sarebbe corretto e 
poi entra nell'else, aggiungendo il dato, ma lasciando inalterato 
l'array, che così "come diventa" non va bene...
Come potrei uscirne? Non riesco a capire come fare...   :-(
Grazie.

 Grazie.
mmh.. mi sa che hai fatto un'po' di confusione..
i risultati che avevi ottenuto credo ti sembrassero corretti solo perche',
di fatto, inner_id era ordinato da 0 in modo crescente e non
conteneva 'buchi'..
comunque il codice che ho scritto dovrebbe funzionare anche nel caso di cui
sopra.. ma cambiando leggermente l'array risultante ma permette di
migliorare il codice e rendere il risultato meglio leggibile e leggermente
piu' elegante..
non testato..
$ext = array();
while ($riga = mysql_fetch_array($risultato, MYSQL_NUM)) {
        if (!isset($ext[$riga[0]])) {
                $ext[$riga[0]] = array($riga);
        } else {
                array_push($ext[$riga[0]], $riga);
        }
}
print_r($ext);
-- 
www.iuz-lab.info

 print_r($ext);
iuz, ti ringrazio e funziona, ma non č esattamente quello che cerco: 
cioč, va bene, ma mi porterebbe a modificare un po' di cose... Mi sono 
incaponita con le chiavi e vorrei portarle con me nell'array, al posto 
degli indici numerici...

 degli indici numerici...
questo codice crea un output decisamente piu' vicino a quello da te voluto..
non testato..
$ext = array();
while ($riga = mysql_fetch_array($risultato, MYSQL_NUM)) {
        $tmp = array('a' => $riga[1], 'b' => $riga[2], 'c' => $riga[3]);
        if (!isset($ext[$riga[0]])) {
                $ext[$riga[0]] = array($tmp);
        } else {
                array_push($ext[$riga[0]], $tmp);
        }
}
while (list($key) = each($ext))
{
        if (count($ext[$key]) == 1)
        {
                $ext[$key] = $ext[$key][0];
        }
}
reset($ext);
-- 
www.iuz-lab.info

 reset($ext);
mentre questo devo mettermelo a studiare un po'.
Per intanto, grazie: sei stato l'unico in tre giorni che abbia preso a 
cuore il caso   ;-)

 reset($ext);
ciao, mi spieghi a cosa mira questa seconda parte del tuo codice?
In effetti, riesco a fare già molto con la prima parte, ma se capissi 
bene la seconda...
Grazie!!

Anna wrote:

supponi di avere un solo elemento da inserire nell'array..
il risultato voluto sarebbe..
Array ( [0] => Array ( [a] => da [b] => db [c] => dc) )
mentre invece con la sola prima parte del codice ottieni..
Array ( [0] => Array ( 
                [0] => Array ( [a] => da [b] => db [c] => dc)
        )
)
che e' utile perche' mi risparmia molto codice che renderebbe la prima parte
molto poco leggibile e inefficiente..
quindi ho semplificato le cose riadattando l'array risultante dalla prima
parte del codice per corrispondere alle tue aspettative che, nello
specifico, sono.. se le righe con lo stesso inner_id sono pari ad uno
(cioe' inner_id singolo).. allora $ext[$inner_id] dovra' contenere
direttamente i valori 'a', 'b', 'c'.. se invece sono pari a piu' di uno
(merging di inner_id).. $ext[$inner_id] dovra' contenere una serie di array
contenenti le informazioni di ogni inner_id interessato..
la seconda parte di questa descrizione e' gia' portata a termine dalla prima
parte del codice.. il problema sorge con gli inner_id che si presentano
singoli (sono array di array mentre invece dovrebbero essere solo array)..
quindi itero tutti gli elementi dell'array alla ricerca degli array con un
singolo elemento e li rendo conformi alle tue specifiche..
while (list($key) = each($ext))
{
 if (count($ext[$key]) == 1)
 {
  $ext[$key] = $ext[$key][0];
 }
}
per capire meglio elimina la seconda parte e stampa il risultato.. vedrai
meglio cosa sto' modificando..
-- 
www.iuz-lab.info

 meglio cosa sto' modificando..
senza while:
Array ( [0] => Array ( [0] => Array ( [a] => aa [b] => ab [c] => ac ) )
	  [1] => Array ( [0] => Array ( [a] => ba [b] => bb [c] => bc ) )
	  [2] => Array ( [0] => Array ( [a] => ca [b] => cb [c] => cc ) )
	  [3] => Array ( [0] => Array ( [a] => da [b] => db [c] => dc )
	                 [1] => Array ( [a] => ea [b] => eb [c] => ec )
	                 [2] => Array ( [a] => fa [b] => fb [c] => fc ) )
	  [4] => Array ( [0] => Array ( [a] => ga [b] => gb [c] => gc ) )
	  [5] => Array ( [0] => Array ( [a] => ha [b] => hb [c] => hc )
	                 [1] => Array ( [a] => ia [b] => ib [c] => ic ) )
	  [6] => Array ( [0] => Array ( [a] => la [b] => lb [c] => lc ) ) )
 
con while:
 
Array ( [0] => Array ( [a] => aa [b] => ab [c] => ac )
         [1] => Array ( [a] => ba [b] => bb [c] => bc )
	  [2] => Array ( [a] => ca [b] => cb [c] => cc )
	  [3] => Array ( [0] => Array ( [a] => da [b] => db [c] => dc )
	                 [1] => Array ( [a] => ea [b] => eb [c] => ec )
			     [2] => Array ( [a] => fa [b] => fb [c] => fc ) )
	  [4] => Array ( [a] => ga [b] => gb [c] => gc )
	  [5] => Array ( [0] => Array ( [a] => ha [b] => hb [c] => hc )
	                 [1] => Array ( [a] => ia [b] => ib [c] => ic ) )
	  [6] => Array ( [a] => la [b] => lb [c] => lc ) )
iuz, in maniera piuttosto paradossale, con il while abbiamo quello che 
io credevo di dovere avere, mentre invece mi sono trovata benissimo con 
il primo sistema    :-)
Eternamente grata!   ;-)

 Eternamente grata!   ;-)
esagerata, per cosi' poco..
-- 
www.iuz-lab.info