Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2011, 18h24   #1
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
Par défaut convertir chaine en tab multidimensionnel

Bonjour a tous !

voila j'ai un soucis, j'ai une chaine de caractere séparé par une virgule et j'aimerai pouvoir la mettre dans un tableau en en 3 dimensions pour pouvoir le reaffiché dans un tableau mais je ne connais pas la syntaxe...

par exemple

1,2,3,4,5,6

ce qui donnerai

1 2 3
4 5 6

si quelqu'un pouvait m'aider ce serait sympa !
je vous remercie pour votre aide
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 18h36   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bonjour,

La solution s'appelle str_split() : par ici
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 18h40   #3
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
les chiffres ne sont qu'un exemple....ca peux etre du texte !dont je ne connais pas la longueur
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 18h50   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Tu connais au moins la longueur de coupe donc :
Code :
1
2
3
4
5
6
7
8
9
$str = "Hello Friend";
$arr = str_split($str, 3); // découpe par bloc de 3 qu'elle que soit la longueur de la chaine
/* $arr vaut Array
(
    [0] => Hel
    [1] => lo
    [2] => Fri
    [3] => end
)*/
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 18h54   #5
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
ou peut-être http://php.net/manual/fr/function.explode.php et ensuite tu utilises les fonctions des tableaux.

(EDIT : il faut faire attention avec str_split car cette fonction n'est pas compatible avec l'encodage utf-8)
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 18h57   #6
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
Citation:
Envoyé par ABCIWEB Voir le message
ou peut-être http://php.net/manual/fr/function.explode.php et ensuite tu utilises les fonctions des tableaux.
j'y arrive pour un tableau simple mais pas en multidimension
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h02   #7
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
A partir de ton tableau à une dimension tu peux bien faire un tableau multidimensionnel, non ?
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h03   #8
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
jamais essayé...
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h11   #9
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Qu'est-ce que tu veux exactement comme résultat final, ça ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
 
    [1] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )
 
)
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h13   #10
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bon je pense qu'il y a une incompréhension. Pourrais-tu nous décrire avec une chaine d'exemple ce que tu attends en sortie.
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h24   #11
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
en faite je recupere 3 données :

quantité, designation, prix, quantité, designation, prix.... que j'aimerais donc pouvoir enregistrer dans un tableau pour pouvoir les reafficher en forme de tableau
quantité designation prix
quantité designation prix
quantité designation prix
....
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h41   #12
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Donc le tableau que je t'ai donné en exemple devrait te convenir. Tu peux utiliser http://www.php.net/manual/fr/function.array-chunk.php (après avoir fait l'explode)
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 19h52   #13
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
ok merci je vais tester ça alors....

si il y a d'autres idées je suis preneuse
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 20h08   #14
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Mais heu ... ça fait juste 3 lignes de code et un peu plus pour l'affichage :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$chaine = 
'quantité1, designation1, prix1
,quantité2, designation2, prix2
,quantité3, designation3, prix3
,quantité4, designation4, prix4';
 
$split = 3;
 
$tab = explode(',',$chaine);
$tab = array_map('trim',$tab);//Supprime les espaces vides
$tab_result = array_chunk($tab,$split);
 
 
// Affichage
if (count($tab_result) > 0)
{
	echo '<table>';
 
	foreach ($tab_result as $value)
		{
			echo '<tr>';
 
			for($i= 0 ; $i < $split; $i++) 
				{
					if (isset($value[$i]))echo '<td>'.$value[$i].'</td>'; else echo '<td>&nbsp;</td>';
				}
 
			echo '</tr>';
		}
 
	echo '</table>';
}
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 20h32   #15
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
... et on pourrait vérifier que ta chaine comprend un nombre d'éléments multiple de 3, sinon c'est qu'elle n'est pas bonne. Ce qui donnerait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$chaine = 'quantité1, designation1, prix1,quantité2, designation2, prix2,quantité3, designation3, prix3,quantité4, designation4, prix4';
 
$split = 3;
 
 
$tab = explode(',',$chaine);
$tab = array_map('trim',$tab); //Supprime les espaces vides
$tab = array_filter($tab); //Supprime les éléments vides
 
$tab_result = array();
if (count($tab) % $split == 0)// Si le nombre d'éléments du tableau est un multiple de $split
{
	$tab_result = array_chunk($tab,$split);
}
else echo 'manque un élément dans la chaine';
 
 
 
// Affichage
if (isset($tab_result) && count($tab_result) > 0)
{
	echo '<table>';
 
	foreach ($tab_result as $value)
		{
			echo '<tr>';
 
			for($i= 0 ; $i < $split; $i++) 
				{
					echo '<td>'.$value[$i].'</td>'; 
				}
 
			echo '</tr>';
		}
 
	echo '</table>';
}
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 20h43   #16
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
je te remercie j'essayerai dans la soirée
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 23h22   #17
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
bon ca fonctionne si je passe outre cette notice :

Citation:
<br />
<b>Notice</b>: Undefined offset: 1 in <b>F:\chemin.php</b> on line <b>89</b><br />
<br />
<b>Notice</b>: Undefined offset: 2 in <b>F:\chemin.php</b> on line <b>89</b><br />
et cette ligne c'est

Code :
$this->MultiCell(0,5,$value[$i],'1','L',false);
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 04h24   #18
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Ah ben oui mais cette ligne ne fait pas partie du code que je t'ai donné.

Comment veux-tu que je puisse te donner un conseil sans connaître le contexte ?
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 09h15   #19
Nouveau Membre du Club
 
Inscription : septembre 2008
Messages : 155
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 155
Points : 35
Points : 35
je ressort mes données pour faire un pdf avec fpdf
tilily est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 22h37   #20
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 559
Points : 1 559
Je t'ai donné un exemple d'affichage html.

Mais si tu veux faire un pdf avec fpdf il faut simplement te servir du tableau $tab_result qui a été généré à partir de la chaine de caractères et donc utiliser $tab_result comme ressource pour l'affichage avec fpdf.

Si l'on prend le tuto n°5 de fpdf pour faire des tableaux cela peut donner ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
//define('FPDF_FONTPATH','/font/');
require('fpdf.php');
 
 
$chaine = '1, designation1, 100,2, designation2, 200,3, designation3, 350.50,4, designation4, 400.25';
 
function Load_Chaine ($chaine)
{
    $split = 3;
 
    $tab = explode(',',$chaine);
    $tab = array_map('trim',$tab); //Supprime les espaces vides
    $tab = array_filter($tab); //Supprime les éléments vides
 
    $tab_result = array();
 
    if (count($tab) % $split == 0)// Si le nombre d'éléments du tableau est un multiple de $split
        {
            $tab_result = array_chunk($tab,$split);//fait des tableaux de $split = 3 éléments
            return $tab_result;
        }
    else return false;
}
 
 
 
class PDF extends FPDF
{
//Chargement des données
function LoadData($file)
{
    //Lecture des lignes du fichier
    $lines=file($file);
    $data=array();
    foreach($lines as $line)
        $data[]=explode(';',chop($line));
    return $data;
}
 
//Tableau simple
function BasicTable($header,$data)
{
    //En-tête
    foreach($header as $col)
        $this->Cell(40,7,$col,1);
    $this->Ln();
    //Données
    foreach($data as $row)
    {
        foreach($row as $col)
            $this->Cell(40,6,$col,1);
        $this->Ln();
    }
}
 
//Tableau amélioré
function ImprovedTable($header,$data)
{
    //Largeurs des colonnes
    $w=array(20,60,30);
    //En-tête
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],7,$header[$i],1,0,'C');
    $this->Ln();
    //Données
    foreach($data as $row)
    {
        $this->Cell($w[0],6,$row[0],'LR');
        $this->Cell($w[1],6,$row[1],'LR');
        $this->Cell($w[2],6,number_format(floatval($row[2]),2,',',' '),'LR',0,'R');
        $this->Ln();
    }
    //Trait de terminaison
    $this->Cell(array_sum($w),0,'','T');
}
 
//Tableau coloré
function FancyTable($header,$data)
{
    //Couleurs, épaisseur du trait et police grasse
    $this->SetFillColor(255,0,0);
    $this->SetTextColor(255);
    $this->SetDrawColor(128,0,0);
    $this->SetLineWidth(.3);
    $this->SetFont('','B');
    //En-tête
    $w=array(20,60,30);
    for($i=0;$i<count($header);$i++)
        $this->Cell($w[$i],7,$header[$i],1,0,'C',1);
    $this->Ln();
    //Restauration des couleurs et de la police
    $this->SetFillColor(224,235,255);
    $this->SetTextColor(0);
    $this->SetFont('');
    //Données
    $fill=false;
    foreach($data as $row)
    {
        $this->Cell($w[0],6,$row[0],'LR',0,'C',$fill);
        $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
        $this->Cell($w[2],6,number_format(floatval($row[2]),2,',',' '),'LR',0,'C',$fill);
        $this->Ln();
        $fill=!$fill;
    }
    $this->Cell(array_sum($w),0,'','T');
}
}
 
 
$tab_chaine = Load_Chaine($chaine);
 
if (is_array($tab_chaine))
    {
     if (count($tab_chaine) > 0)
        {
            $pdf=new PDF();
            //Titres des colonnes
            $header=array('Quantité','Désignation','prix');
            //Chargement des données
            $data=$tab_chaine;
            $pdf->SetFont('Arial','',14);
            $pdf->AddPage();
            $pdf->BasicTable($header,$data);
            $pdf->AddPage();
            $pdf->ImprovedTable($header,$data);
            $pdf->AddPage();
            $pdf->FancyTable($header,$data);
            $pdf->Output();
        }
        else echo 'La chaine est vide';
    }
else echo 'Il manque un élément dans la chaine';
?>
...remarques que par rapport au code du tuto j'ai modifié les fonctions "ImprovedTable" et "FancyTable" pour les adapter à un tableau de trois colonnes.
Et je n'ai pas utilisé la fonction "LoadData" puisque j'ai créé une fonction "Load_Chaine" qui reprend mon précédent code.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h15.


 
 
 
 
Partenaires

Hébergement Web