intabellare array bidimensionale, foreach impazziti

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

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

[table="width: 200, class: grid"]
[tr]
[td]Nomi[/td]
[td]Lavoro[/td]
[td]Eta[/td]
[/tr]
[tr]
[td]pippo[/td]
[td]1[/td]
[td]20[/td]
[/tr]
[tr]
[td]pluto[/td]
[td]1[/td]
[td]30[/td]
[/tr]
[tr]
[td]paperino[/td]
[td]10[/td]
[td]41[/td]
[/tr]
[/table]

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
 
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>";
?>
 
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:
[table="width: auto, class: grid, align: left"]
[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]
 
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
 
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:
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.
 
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>
 
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
 
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?
 
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:
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>
 
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:
 
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?
 
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