To be Array or Not

Eléphant du PHP | 250 Messages

23 déc. 2009, 20:19

Bonsoir,

J'apprends le PHP, et je bute un peu sur les tableaux notamment multidimensionnels. :roll:

Je me fixe un exemple à comprendre et autant qu'il soit complexe pour mieux l'appréhender. La notion de tableaux met très abstraites malgré mes bouquins.

En faites, je pense avoir besoin de déchiffrer le array pour mieux l'apprivoiser.

J'imagine un tableau qui contient 2 pays, des clients avec leurs références :

Code : Tout sélectionner

Array ( [France] => Array ( [nom] => Bob [adresse] => 6,rue bilo [code postal] => 50520 [0] => Array ( [nom] => Alain [adresse] => 16 rue sapins [code postal] => 18520 ) [1] => Array ( [nom] => Claude [adresse] => 15 rue sapins [code postal] => 18520 ) ) [Espagne] => Array ( [nom] => Alice [adresse] => 8,rue espagna [code postal] => 3054-a ) )
Le 1er Array contient toutes les données, c'est le tableau principale.
Les 2 Array suivant France et Espagne sont 2 tableaux distincts.
Ensuite viennent des Arrays pour chaque client, et ceux-ci contiennent des données différentes.

Mais c'est quand j'ai rajouté Alain et Claude que je ne pige plus. Pourquoi, il me met des indices pour eux [0..1] ?
<?php
$clients=array
("France"=>array("nom"=>"Bob","adresse"=>"6,rue bilo","code postal"=>"50520"),
 "Espagne"=>array("nom"=>"Alice","adresse"=>"8,rue espagna","code postal"=>"3054-a")
);
$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');

print_r($clients);
?>
Il devrait pas me mettre des indices car c'est un tableau associatif globalement.
Je cherche à comprendre, comment structurer un tableau. C'est un vrai smiblique les array. :?

MErci pr votre aide
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Mammouth du PHP | 693 Messages

23 déc. 2009, 21:45

Lorsque tu fais $array[], ca revient à rajouter au tableau une entrée indicée par l'index numérique suivant. Dans ton cas, le code equivalent est :
$clients=array
("France"=>array("nom"=>"Bob","adresse"=>"6,rue bilo","code postal"=>"50520"),
 "Espagne"=>array("nom"=>"Alice","adresse"=>"8,rue espagna","code postal"=>"3054-a")
);
$clients['France'][0] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France'][1] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');

print_r($clients);
Ton problème viens de la mauvaise définition de ton tableau, car sa structure te permet d'avoir un seul client par pays. Voyons comment construire ton tableau.

Au départ, tu fais un tri en fonction du pays. Ton premier niveau représente un tableau de pays.

Donc la déclaration :
$clients=array('nom1'=>$pays1,...);

Dans chaque pays, tu peux avoir plusieurs clients.Il faut donc les référencer dans un tableau (deuxième niveau). Puisque apparament tu n'a rien pour les indexer, le tableau ne sera pas associatif.
$pays = array ($client1,$client2,$client3,...);

Et chaque client est un tableau associatif (troisième niveau).

Avec cette structure, chaque niveau correspond au même concept (pays, liste de client ou client), ce qui rendra ton exploitation beaucoup plus facile.

Ai je un peu éclairci la situation ?

ViPHP
AB
ViPHP | 5818 Messages

23 déc. 2009, 21:58

Effectivement ton tableau n'était pas bien structuré au départ. Pour reprendre ton exemple tu peux faire ainsi
<?php
$clients = array();


$clients['Espagne'][] = array("nom" => "Alice","adresse" => "8,rue espagna","code postal" => "3054-a");
$clients['France'][] = array("nom" => "Bob","adresse" => "6,rue bilo", "code postal"=>"50520");

$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');

echo '<pre>';
print_r($clients);
echo '</pre>';
?>

Eléphant du PHP | 250 Messages

23 déc. 2009, 22:11

Et le 3ème niveau :
Un tableau pour chaque client.

$client=array('Nom'=>'Diana','Adresse'=>'rue d'ici','CP'=>'18000');
$client=array('Nom'=>'Lili','Adresse'=>'rue d'ici','CP'=>'18000');

On peut pas faire mieux pour que je comprenne =D>

En faites, ça fait un peut comme le concept objet class... :lol:

Merci beaucoup pour la réponse. C'est tellement rare d'avoir une réponse clair précise pour ne pas citer un site "le 0..".

Je vais rajouter ces lignes(struture) de code dans mon livre qui est très bon, mais un livre n'est jamais parfait #-o
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

23 déc. 2009, 22:17

<?php
$clients=array
(
	"France" => array (
		array("nom"=>"Bob","adresse"=>"6,rue bilo","code postal"=>"50520")
		),
	"Espagne" => array (
		array("nom"=>"Alice","adresse"=>"8,rue espagna","code postal"=>"3054-a")
		)
);
$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['Espagne'][] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');
print_r($clients);
?>
Voilà, ça donne ça en structurant mieux les tableux
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

23 déc. 2009, 22:24

Par contre j'ai un soucis là. Je me suis dit, pourquoi ne pas remplacer les indices en "client":

Code : Tout sélectionner

Array ( [France] => Array ( [0] => Array ( [nom] => Bob [adresse] => 6,rue bilo [code postal] => 50520 ) [client] => Array ( [nom] => Claude [adresse] => 15 rue sapins [code postal] => 18520 ) [1] => Array ( [nom] => Alain [adresse] => 16 rue sapins [code postal] => 18520 ) ) [Espagne] => Array ( [0] => Array ( [nom] => Alice [adresse] => 8,rue espagna [code postal] => 3054-a ) [client] => Array ( [nom] => Claude [adresse] => 15 rue sapins [code postal] => 18520 ) ) )
<?php
$clients=array
(
	"France" => array (
                    array("nom"=>"Bob","adresse"=>"6,rue bilo","code postal"=>"50520")
		),
	"Espagne" => array (
                    array("nom"=>"Alice","adresse"=>"8,rue espagna","code postal"=>"3054-a")
		)
);
$clients['France']['client'] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France']['client'] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['Espagne']['client'] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');
print_r($clients);
?>
ça ne fonctionne pas complètement ! On peut pas retrouver l'information de cette façon !?! Ce qui me parait probablement logique.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

23 déc. 2009, 22:41

Effectivement ton tableau n'était pas bien structuré au départ. Pour reprendre ton exemple tu peux faire ainsi
<?php
$clients = array();


$clients['Espagne'][] = array("nom" => "Alice","adresse" => "8,rue espagna","code postal" => "3054-a");
$clients['France'][] = array("nom" => "Bob","adresse" => "6,rue bilo", "code postal"=>"50520");

$clients['France'][] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France'][] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');

echo '<pre>';
print_r($clients);
echo '</pre>';
?>
C'est très subtile le PHP, ya beaucoup de façon pour faire la même chose. C'est assez déroutant quant on débute. #-o
Avec des doubles quotes, simples quotes...c'est pas très normalisé je trouve.
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
AB
ViPHP | 5818 Messages

23 déc. 2009, 22:44

Dans l'exemple que je t'ai donné les clients sont indexés numériquement et automatiquement ce qui n'apporte pas de facilité pour faire des recherches. Par contre tu pourrais mettre comme index un identifiant unique, un numéro de client, ou son email de contact (s'il n'en a qu'un), le tout est que l'index soit unique et définisse chaque client.

Donc un autre exemple avec le mail en index
<?php
$clients = array();


$clients['Espagne']['[email protected]'] = array("nom" => "Alice","adresse" => "8,rue espagna","code postal" => "3054-a");
$clients['France']['[email protected]'] = array("nom" => "Bob","adresse" => "6,rue bilo", "code postal"=>"50520");

$clients['France']['[email protected]'] = array('nom' => 'Alain','adresse'=>'16 rue sapins','code postal'=>'18520');
$clients['France']['[email protected]'] = array('nom' => 'Claude','adresse'=>'15 rue sapins','code postal'=>'18520');

echo '<pre>';
print_r($clients);
echo '</pre>';


//Avec cette configuration tu peux facilement trouver les coordonnées d'un client français qui te donne son email (ou l'identifiant que tu auras mis en index)

$recherche = '[email protected]';
$pays = 'France';


if(array_key_exists($recherche,$clients[$pays]))
{
	foreach ($clients[$pays][$recherche] as $index => $value)
		{
		echo $index. ' = ' . $value .'<br />';
		}
}
?>

Eléphant du PHP | 250 Messages

23 déc. 2009, 23:11

hé ben voilà je me disais ya bien une astuce pour remplacer les indices par quelque chose de plus parlant.

L'exemple, il est joli, avec une condition et une boucle pour parcourir le tableau.(php5 Mapplication, dont je suis restée sur ma fin... :| )

Là j'étudie le livre de MAttZandstra, il est petit mais bien surtout les exemples petits et pas trop "matheux". Mais j'ai pas encore étudier les boucles avec celui là.

J'espère que je vais pas dépasser 5 livres en PHP pour savoir créer mes scripts :mrgreen:

A force de lire et relire, je crois que ça va rentrer :twisted:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
AB
ViPHP | 5818 Messages

24 déc. 2009, 00:51

Oui ça va bien finir par rentrer :) Faut juste du temps et de la persévérance.
Sinon y'a les tuto de http://www.phpdebutant.org (colonne de droite) qui sont pas mal aussi pour débuter :wink: