intabellare array bidimensionale, foreach impazziti

Monital

Utente Attivo
15 Apr 2009
778
2
18
Sera,

come al solito ho difficoltà a intabellare in html il risultato di cilcli

questa è più complessa però e dopo due giorni di prove(che vi risparmio) non ne vengo a capo.

in sintesi ho un multiarray che mi restituisce una cosa del genere

PHP:
array(8) {
  ["Lavoro"]=>
  array(46) {
    ["pippo"]=>    string(1) "1"
    ["pluto"]=>    string(1) "1"
    ["paperino"]=> string "10"
  }
  ["Eta"]=>
  array(46) {
    ["pippo"]=>    string(1) "20"
    ["pluto"]=>    string(1) "30"
    ["paperino"]=>    string(1) "41"
   
  }
}

//e cosi via

il multi array proviene da una serie di query e in finale viene composto cosi

PHP:
$multi_array[$lavoro][$eta]=$row['totale']

cmq aldilà di come si forma quest'array considerando che tutti ciò che è presente nell'array è un risultato di query quindi non conosco a priori ne chiavi ne valori come intabello quel multi array considerando che deve seguire questo schema

NomiLavoroEta
pippo120
pluto130
paperino1041

Inoltre chiedo cortesemento di farmi capire quando e perchè va aperto il '<tr>' ed il <td> a seconda di come si vuole impostare la tabella

Thank
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
se non ho capito male quello che vuoi fare prova così
PHP:
<?php
$multi_array["Lavoro"]["pippo"]="1";
$multi_array["Lavoro"]["pluto"]="1";
$multi_array["Lavoro"]["paperino"]="10";
$multi_array["Eta"]["pippo"]="20";
$multi_array["Eta"]["pluto"]="30";
$multi_array["Eta"]["paperino"]="41";
echo "<pre>";
var_dump($multi_array);//per vedere il multi array
echo "</pre>";
// e visualizzi la tabella
echo "<table>
		<th><td>nomi</td><td>lavoro</td><td>età</td></th>";
foreach($multi_array["Lavoro"] as $nome => $valore){
	echo "<tr><td>$nome</td><td>$valore</td><td>".$multi_array["Eta"][$nome]."</td></tr>";
}
echo "</table>";
?>
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Inoltre chiedo cortesemento di farmi capire quando e perchè va aperto il '<tr>' ed il <td> a seconda di come si vuole impostare la tabella

Thank

<tr></tr> si usa per definire una riga nella tabella.
All'interno di ogni riga puoi creare quindi le celle tramite <td></td>.

Se per esempio volessi una tabella con due righe e due colonne, dovresti fare così:
HTML:
<table>
    <tr>
        <td>Cella 1 | Colonna 1</td>
        <td>Cella 2 | Colonna 2</td>
    </tr>
    <tr>
        <td>Cella 3 | Colonna 1</td>
        <td>Cella 4 | Colonna 2</td>
    </tr>
</table>

Il risultato del codice sarà qualcosa di questo tipo:
Cella 1 | Colonna 1Cella 2 | Colonna 2
Cella 3 | Colonna 1Cella 4 | Colonna 2
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
bè flameseeker vabbè tutto ma siamo alle basi lì, io intendevo l'apertura nei cicli con più foreach.

@borgo


non è propriamente quello il problema perchè ad esempio

$multi_array["Lavoro"]["paperino"]="10";

Io non conosco a priori Lavoro e Eta nel senso che quelle variabili mi escono dall'estrazione dei campi del database, in pratica devo creare una cosa dinamica in maniera che se aggiungo un campo al dataabse lo script nond evo modificarlo , fors ti ho scritto male l'array che in realta sarebbe


PHP:
 $multi_array[$intestazione_tabella][$lista_nomi]=$row['totale']

dove

$intestazioni tabella = intestazioni dei campi ricavati da una query

$nomi = una select distinct contenente tutti i nomi della tabella

$row['totale']= il risultato di una select count

l'array che mi viene restituito è impostato come dico io cioè


PHP:
array(8) {
  ["Lavoro"]=>
  array(46) {
    ["pippo"]=>    string(1) "1"
    ["pluto"]=>    string(1) "1"
    ["paperino"]=> string "10"
  }
  ["Eta"]=>
  array(46) {
    ["pippo"]=>    string(1) "20"
    ["pluto"]=>    string(1) "30"
    ["paperino"]=>    string(1) "41"
   
  }
}

//e cosi via

però con la differenza che io non conosco ne le chiavi ne i valori all'interno degli array, l'ho costruito cosi eprchès e un domani aggiungo il campo CITTA viene riconosciuto senza più toccare los cript ed il multi array mi diventa

PHP:
array(8) {
  ["Lavoro"]=>
  array(46) {
    ["pippo"]=>    string(1) "1"
    ["pluto"]=>    string(1) "1"
    ["paperino"]=> string "10"
  }
  ["Eta"]=>
  array(46) {
    ["pippo"]=>    string(1) "20"
    ["pluto"]=>    string(1) "30"
    ["paperino"]=>    string(1) "41"
   
  }
  ["Citta"]=>
  array(46) {
    ["pippo"]=>    string(1) "Topolina"
    ["pluto"]=>    string(1) "Topolinia"
    ["paperino"]=>    string(1) "Paperopoli"
   
  }
}

//e cosi via
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
bè flameseeker vabbè tutto ma siamo alle basi lì, io intendevo l'apertura nei cicli con più foreach.

Avevo inteso male io, pardon!
Se non conosci a priori i valori del tuo array potresti provare così:
PHP:
<?php

$keys = array_keys($multi_array);

?>

<table>
    <thead>
        <tr>
            <th>Nomi</th> <!-- unico campo fisso considerando la struttura del tuo array -->
            <th>
<?php 
            #> Genero l'intestazione con le chiavi prmarie del multi_array
            echo implode('</th><th>', $keys);
?>
            </th>
        </tr>
    </thead>
    <tbody>
<?php
        #> Scorro le righe della prima chiave, per determinare il numero di righe della tabella
        foreach ($multi_array[$keys[0]] as $id => $count) {
        
            echo '<tr>';

            #> Inserisco il nominativo per la riga
            echo '<td>', $id, '</td>';

            #> Adesso scorro le chiavi primarie, per determinare il numero delle colonne
            #> e prelevare i dati giusti da inserire nelle celle
            foreach ($keys as $key) {
            
                echo '<td>';
                echo $multi_array[$key][$id];
                echo '</td>';
            }

            echo '</tr>';
        }
?>
    </tbody>
</table>
 
Ultima modifica:

Monital

Utente Attivo
15 Apr 2009
778
2
18
GRANDE !!!!!!!!!!

Ho capito anche il discorso dell'apertura chiusura dei tag vedendo quell'implode.

solo un paio di cose

Al posto di $keys vorrei mettere un immagine legata a $keys appunto

PHP:
            echo implode('</th><th>','<img src="http://'.URL_TO_IMG.'/img/'.$keys.'.gif" width="20px" height="20px">');

però cosi non me la prende, come mai? concettualmente dovrebbe farlo.
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Non proprio: implode non è un ciclo, bensì è una funzione che prende i valori dell'array e li "incolla" usando il pezzo di stringa specificato nel primo parametro e l'ho usato per velocità e praticità.

Se l'immagine che devi includere nell'intestazione è la stessa per ogni colonna, allora si puoi farlo nell'implode così:
PHP:
echo implode('</th><th><img src="http://'.URL_TO_IMG.'/img/immagine.gif" width="20px" height="20px">', $keys);

Se la tua "immagine.gif" è però un dato variabile e ricollega effettivamente ad un immagine diversa per ogni colonna, allora devi tornare al foreach:
PHP:
    <thead>
        <tr>
            <th>Nomi</th> <!-- unico campo fisso considerando la struttura del tuo array -->
<?php 
            #> Genero l'intestazione con le chiavi prmarie del multi_array
            foreach ($keys as $key) {
                echo '<th>';
                echo '<img src="http://', URL_TO_IMG, '/img/', $key, '.gif" width="20px" height="20px">', $key;
                echo '</th>';
            }
?>
        </tr>
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
Già che stupido.

Però quella dell'implode mi sarà utilissima per un altra cosa.

Funge tutto come dio comanda. Perfino il tablesorter che ho applicato funge ottimamente.

Grande, grande.

Ti perdono per la tua svista iniziale :quote:


:beer: :beer:

p.s. lo dico sempre che sto forum è il migliore
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
Ah n'altra cosa flame, visto che sei sull'onda.

se volessi aggiungere un ulteriore colonna dove faccio il totale?

L'intestazione ho capito come emtterla ed anche il corpo ma come si fa una somma su un array cosi composto?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
prova questo, se aggiungi es "Clima" ti stampa anche quella e così via, per ora però devi considerare che ad ogni
chiave primaria (Lavoro, Eta,...) devono corrispondere sempre le chiavi secondarie
es. non se hai [Lavoro][paperino] devi avere sempre [eta][paperino] ecc..
ma questo problema devi risolverlo eventualmente a monte quando estrai dal db costruendo il multi_array
PHP:
<?php
$multi_array["Lavoro"]["pippo"]="1";
$multi_array["Lavoro"]["pluto"]="1";
$multi_array["Lavoro"]["paperino"]="10";
$multi_array["Eta"]["pippo"]="20";
$multi_array["Eta"]["pluto"]="30";
$multi_array["Eta"]["paperino"]="41";
$multi_array["Citta"]["pippo"]="Topolina";
$multi_array["Citta"]["pluto"]="Topolina";
$multi_array["Citta"]["paperino"]="Paperopoli";
$multi_array["Altezza"]["pippo"]="300 m";
$multi_array["Altezza"]["pluto"]="300 m";
$multi_array["Altezza"]["paperino"]="250 m";
/*
echo "<pre>";
var_dump($multi_array);
echo "</pre>";
*/
echo "<table border=\"1\"><tr><th>nomi</th>";
foreach($multi_array as $tipo => $arr){//creo l'intestazione
	echo "<th>$tipo</th>";
	foreach($arr as $nome => $valore){
		$nuova[$nome][]=$valore;//mi costruisco un nuovo array
	}
}
echo "</tr>";
foreach($nuova as $n => $v){
	echo "<tr><td>$n</td>";
	foreach($v as $c => $v2){
		echo "<td>$v2</td>";
	}
	echo "</tr>";
}
echo "</table>";
?>
forse esiste un metodo migliore, però ancora non ci ho pensato

p.s.
avevo fatto un errore nella tabella cioè avevo scritto
<th><td>.....</td></th>
la sintassi corretta è
<tr><th>.....</th></tr>

ops, non mi ero accorco che flame aveva postato un sistema migliore
 
Ultima modifica:

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Aggiungi la colonna del totale come prima cosa nell'intestazione della tabella:
PHP:
    <thead>
        <tr>
            <th>Nomi</th>
<?php 
            #> Genero l'intestazione con le chiavi prmarie del multi_array
            foreach ($keys as $key) {
                echo '<th>';
                echo '<img src="http://', URL_TO_IMG, '/img/', $key, '.gif" width="20px" height="20px">', $key;
                echo '</th>';
            }
?>
            <th>Totale</th>
        </tr>


Quando viene generato il corpo sommi il risultato in una variabile che riazzeri ad ogni inizio giro:
PHP:
    <tbody>
<?php
        #> Scorro le righe della prima chiave, per determinare il numero di righe della tabella
        foreach ($multi_array[$keys[0]] as $id => $count) {
        
            #> Inizio Riga: Azzero il totale
            $totale = 0;
            echo '<tr>';

            #> Inserisco il nominativo per la riga
            echo '<td>', $id, '</td>';

            #> Adesso scorro le chiavi primarie, per determinare il numero delle colonne
            #> e prelevare i dati giusti da inserire nelle celle
            foreach ($keys as $key) {
            
                echo '<td>';
                echo $multi_array[$key][$id];
                echo '</td>';

                #> Costruendo le colonne per la riga corrente aggiorno il valore del totale
                $totale += $multi_array[$key][$id];
            }

            #> Mostro la colonna col totale di questa riga
            echo '<td>', $totale, '</td>';

            echo '</tr>';
        }
?>
    </tbody>
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
Stavo postando proprio questa flame, ci ero arrivato solo che stavo diventando amtot dove piazzare la nuova colonna, ci son riuscito.

Grazie ad entrambi.

siete proprio in gamba :fonzie:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
posso farti una domanda che non c'entra con php?
mi ha incuriosito il fatto del totale, spero che i titoli delle colonne non rispecchino quello che devi fare perchè
se es
lavoro =2
eta = 35
totale = 37
non stai sommando le pere con le mele?
 

Monital

Utente Attivo
15 Apr 2009
778
2
18
no sto creando un albo dìoro dove lavoro ed età sono le varie competizioni ed il totale è il totale delle competizioni acquisite.

ho usato lavoro eta per cercare di spiegarmi in amniera più semplice, poi l'idea del totale mi è arrivata strada facendo
 
Discussioni simili
Autore Titolo Forum Risposte Data
grottafelix Intabellare i dati di un record Classic ASP 2
grottafelix Tutorial per intabellare Un immagine Photoshop 0
otto9due Leggere valore da array multidimensionale a chiavi dinamiche PHP 1
M Passaggio variabili array php su un tasto jq PHP 3
M Somma inversa di Array C/C++ 2
MarcoGrazia Iterazione array PHP 5
N Passare array da php a javascript PHP 5
G Ordinare un array multidimensionale PHP 4
H Errore su array associativo PHP 1
K Array senza ripetizioni Presentati al Forum 4
A Gestione array multidimensionale PHP 6
otto9due Più chiavi in array con array_key_exists() PHP 0
M Array associativi php su 2 campi mysql PHP 10
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L Sessione e array per utenti PHP 0
R Importazione csv su mysql tramite array PHP 2
elpirata Ricavare e stampare indirizzo ip da array associativo PHP 0
P Ciclare tra array di oggetti PHP 1
R Raggruppare valori array PHP 5
S Come conoscere la posizione di numeri in un array escludendo i doppioni PHP 4
D Popolare array PHP 8
R Includere elementi array fra apici PHP 1
P Array da foreach PHP 2
N Variabile di sessione è un array PHP7 PHP 3
R Scorporare array e recuperare record tabella PHP 10
A Contare gli elementi di un array PHP 13
A Importare array in mysql PHP 1
A Array di immagini Sviluppo app per Android 10
D Chiave unica in estrazione dati da array php PHP 0
D Spazio vuoto in un elemento di un array php PHP 2
S Come filtrare valori di un array PHP 4
mazman mysqli_query() mi ritorna un array vuoto anche se presente un record nella tabella PHP 13
A Non è un array e nemmeno un intero, che tipo di dato è? Javascript 1
max1974 PHP, Array Multidimensionale e Grafici PHP 22
S [PHP] Confrontare due array con valori quasi uguali PHP 2
MarcoGrazia [PHP] Unioni di due array con somma di valori PHP 6
R [PHP] Visualizzazione dati Array PHP 2
S [PHP] Eliminare doppioni array e rinumerare le posizioni PHP 2
M Importare - Manipolare Json Array Sviluppo app per Android 2
M [PHP] Problemi su inserimento array nel db PHP 7
M [PHP] Visualizzare un array partendo dal numero 1 e non 0 PHP 5
G [ASP] Ciclare i valori di 2 array Classic ASP 2
S [PHP] Estrarre elementi array su più variabili PHP 5
S [PHP] Estrarre dati tabella in diversi array PHP 2
max1974 [PHP] Raggruppare array PHP 4
A [PHP] Caricamento database in array PHP 11
G sql select con array in php PHP 1
L [Java] Aggiungere elementi ad array JSON Java 0
S [PHP] individuare chiave elemento array PHP 7

Discussioni simili