Construction d'url et accès aux éléments d'un ss-tableau

Eléphant du PHP | 71 Messages

02 févr. 2007, 00:38

Bonsoir,

Je me suis emmêlé les pinceaux en tentant de créer une url. :?

De base, j'ai un tableau associatif qui comprend d'autres tableaux associatifs et mon but est de construire un lien pour chaque tableau imbriqué.
Pour chaque lien, l'intitulé est constitué de la clé correspondante au tableau imbriqué et l'url des membres du tableau correspondant.

hem... oui, ce n'est pas très clair mais un bout de code vous en dira plus... :lol:
<?php
	$menus = array
	(
		'menu 1' => array
		(
			'intitulé 1.1' => 'lien1-1.php',
			'intitulé 1.2' => 'lien1-2.php',
			'intitulé 1.3' => 'lien1-3.php'
		),
		'menu 2' => array
		(
			'intitulé 2.1' => 'lien2-1.php',
			'intitulé 2.2' => 'lien2-2.php',
			'intitulé 2.3' => 'lien2-3.php',
			'intitulé 2.4' => 'lien2-4.php'
		),
		'menu 3' => array
		(
			'intitulé 3.1' => 'lien3-1.php',
			'intitulé 3.2' => 'lien3-2.php'
		)
	);

	echo "\t<p>|";
	foreach($menus as $menu => $array)
	{
		foreach($menus[$menu] as $key => $value)
			$url += "$key=$value&";
		$url = substr($url, 0, strlen($url) - 1);
		$url = urlencode("index.php?$url");
		echo " <a href=\"$url\">".$menu++."</a> |";
	}
	echo "</p>\n";
?>
A priori, le foreach dans le foreach, ce n'est pas très conventionnel ; je ne récupère que l'intitulé et pas l'url... donc comment faîtes-vous dans ce cas ? :)

ViPHP
ViPHP | 1961 Messages

02 févr. 2007, 02:29

Bonsoir,

Ce n'est pas un PB de foreach imbriqués, c'est la façon dont tu récupères les valeurs dans le foreach.

Je n'ai pas adapté les boucles à ton code, c'est juste pour que tu comprennes.
<?php
    $menus = array
    (
        'menu 1' => array
        (
            'intitulé 1.1' => 'lien1-1.php',
            'intitulé 1.2' => 'lien1-2.php',
            'intitulé 1.3' => 'lien1-3.php'
        ),
        'menu 2' => array
        (
            'intitulé 2.1' => 'lien2-1.php',
            'intitulé 2.2' => 'lien2-2.php',
            'intitulé 2.3' => 'lien2-3.php',
            'intitulé 2.4' => 'lien2-4.php'
        ),
        'menu 3' => array
        (
            'intitulé 3.1' => 'lien3-1.php',
            'intitulé 3.2' => 'lien3-2.php'
        )
    );

    
    foreach($menus as $menu => $contenu)
    {
        echo $menu ."<br />";
        foreach($contenu as $intitule => $lien){
          echo $lien ."<br />";
        }
        echo "</p>\n";
    }
?> 
Ce qui me donne un résultat

Code : Tout sélectionner

menu 1 lien1-1.php lien1-2.php lien1-3.php menu 2 lien2-1.php lien2-2.php lien2-3.php lien2-4.php menu 3 lien3-1.php lien3-2.php
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 71 Messages

02 févr. 2007, 10:00

Salut,

Ne peut-on pas remplacer :
    foreach($menus as $menu => $array)
    {
        foreach($array as $key => $value)
        ...
    } 
par :
    foreach($menus as $menu => $array)
    {
        foreach($menus[$menu] as $key => $value)
        ...
    }
?

J'avais cru mais, bon, je ne peux pas tester de suite ne disposant pas de PHP au boulot... (c'est dur la vie :( )
En voyant ta réponse, j'ai regardé vite fait ce matin en remplaçant $menus[$menu] par $array mais j'obtenais le même résultat à la sortie du second foreach, à savoir 0.
Maintenant, en relisant mon code, je pense avoir une autre erreur...

Ne serait-ce pas :
$url .= "$key=$value&";
plutôt que :
$url += "$key=$value&";
?

Je me plante toujours entre les deux... :?

Mammouth du PHP | 514 Messages

02 févr. 2007, 10:04

.= est une concaténation
+= est une addition

Eléphant du PHP | 71 Messages

02 févr. 2007, 10:12

erf... voilà ce que c'est que de faire du JS à gogo puisque dans ce langage, je dois bien mettre += pour faire la concaténation d'une chaîne... :roll:

Bon, je confirme dès que je retrouve PHP mais à priori, l'erreur vient bien de là...

Merci :)

Eléphant du PHP | 71 Messages

03 févr. 2007, 18:47

Salut, :)

Le problème était donc bien que je faisais une addition au lieu d'une concaténation... :P bref, j'ai réussi à faire ce que je voulais... mais... (parce qu'il en faut un), j'ai un soucis avec urldecode / urlencode. Si je passe une chaine de texte avec des accents, des espaces ou toute sorte de caractères spéciaux, urlencode m'encode bien cette chaîne pour l'url... Le soucis, c'est au moment de décoder...

Par exemple, lorsque je veux récupérer "intitulé 1.1" après passage dans l'url, ça me met "intitulé_1_1". :?

Dois-je passer par une autre fonction ou faut-il s'en servir d'une autre manière ?

Mon code actuel est celui-ci :
<?php
	$menus = array
	(
		'menu 1' => array
		(
			'intitulé 1.1' => 'lien1-1.php',
			'intitulé 1.2' => 'lien1-2.php',
			'intitulé 1.3' => 'lien1-3.php'
		),
		'menu 2' => array
		(
			'intitulé 2.1' => 'lien2-1.php',
			'intitulé 2.2' => 'lien2-2.php',
			'intitulé 2.3' => 'lien2-3.php',
			'intitulé 2.4' => 'lien2-4.php'
		),
		'menu 3' => array
		(
			'intitulé 3.1' => 'lien3-1.php',
			'intitulé 3.2' => 'lien3-2.php'
		)
	);

	echo "\t<p>|";
	foreach($menus as $menu => $array)
	{
		$url = '';
		foreach($menus[$menu] as $key => $value)
		{
			$key = urlencode($key);
			$url .= "$key=$value&";
		}
		$url = substr($url, 0, strlen($url) - 5);
		echo " <a href=\"index.php?$url\">".$menu."</a> |";
	}
	echo "</p>\n";
	
	if(count($_GET) > 0)
	{
		echo "\t<ul>\n";
		foreach($_GET as $lien => $url)
		{
			$lien = urldecode($lien);
			echo "\t\t<li><a href=\"$url\">$lien</a></li>\n";
		}
		echo "\t</ul>\n";
	}
?>

Eléphant du PHP | 71 Messages

04 févr. 2007, 11:23

Personne ne sait ?

J'ai cru voir que certains passaient par des fonctions du type strtr mais je ne suis pas sûr de la méthode à adopter... Peut-être faut-il tout simplement éviter de transmettre des données de cette manière mais ça me paraît louche... :?

Eléphant du PHP | 71 Messages

04 févr. 2007, 19:29

Vu que je n'ai pas de réponse, je devais être complètement dans les choux... :? Du coup, j'ai essayé autrement (en passant une variable plutôt que la chaine de texte à l'url) mais ça ne marche toujours pas... :cry:

Quelqu'un sait-il pourquoi ?
<?php
	$menus = array
	(
		'menu 1' => array
		(
			'intitulé 1.1' => 'lien1-1.php',
			'intitulé 1.2' => 'lien1-2.php',
			'intitulé 1.3' => 'lien1-3.php'
		),
		'menu 2' => array
		(
			'intitulé 2.1' => 'lien2-1.php',
			'intitulé 2.2' => 'lien2-2.php',
			'intitulé 2.3' => 'lien2-3.php',
			'intitulé 2.4' => 'lien2-4.php'
		),
		'menu 3' => array
		(
			'intitulé 3.1' => 'lien3-1.php',
			'intitulé 3.2' => 'lien3-2.php'
		)
	);

	echo "\t<p>|";
	$i = 0;
	foreach($menus as $menu => $array)
	{
		$param = 'param='.$i++;
		echo " <a href=\"passage-tab-by-php.php?$param\">".$menu."</a> |";
	}
	echo "</p>\n";
	
	if(isset($_GET['param']))
	{
		$length = count($menus);
		echo "\t<ul>\n";
		for($i = 0; $i < $length; $i++)
			if($i == $_GET['param'])
				foreach($menus[$i] as $key => $value)
					echo "\t\t<li><a href=\"$key\">$value</a></li>\n";
		echo "\t</ul>\n";
	}
?>
J'obtiens un :
Warning: Invalid argument supplied for foreach() ...

Eléphant du PHP | 71 Messages

04 févr. 2007, 20:22

une petite amélioration mais ce n'est toujours pas ça... Maintenant, je récupère tous les sous-tableaux alors que je ne veux que celui correspondant au paramètre que j'ai passé en $_GET :roll:
<?php
	$menus = array
	(
		'menu 1' => array
		(
			'intitulé 1.1' => 'lien1-1.php',
			'intitulé 1.2' => 'lien1-2.php',
			'intitulé 1.3' => 'lien1-3.php'
		),
		'menu 2' => array
		(
			'intitulé 2.1' => 'lien2-1.php',
			'intitulé 2.2' => 'lien2-2.php',
			'intitulé 2.3' => 'lien2-3.php',
			'intitulé 2.4' => 'lien2-4.php'
		),
		'menu 3' => array
		(
			'intitulé 3.1' => 'lien3-1.php',
			'intitulé 3.2' => 'lien3-2.php'
		)
	);

	echo "\t<p>|";
	$i = 0;
	foreach($menus as $menu => $array)
	{
		$param = 'param='.$i++;
		echo " <a href=\"passage-tab-by-php.php?$param\">".$menu."</a> |";
	}
	echo "</p>\n";
	
	
	$length = count($menus);
	if(isset($_GET['param']))
		for($i = 0; $i < $length; $i++)
			foreach($menus as $key => $value)
				if($i == $_GET['param'])
				{
					echo "\t<ul>\n";
					foreach($value as $cle => $valeur)
						echo "\t\t<li><a href=\"$valeur\">$cle</a></li>\n";
					echo "\t</ul>\n";
				}
?>

Mammouth du PHP | 19672 Messages

04 févr. 2007, 21:49

Je trouve que tu t'enquiquine pas mal pour constuire tes urls et récupérer les valeurs. Il faudrait pour la récupération disposer d'un point de repère fixe, donc tu pourrais envoyer deux valeurs mais avec des clés fixes au lieu d'une valeur avec une clé dynamique. Et en encodant les deux, tu décodes à l'arrivée :

Construction de ton menu :
    foreach($menus as $menu => $array)
    {
        $param = 'param='.$i++;
        echo " <a href=\"passage-tab-by-php.php?m=". urlencode($menu) ."&p=". urlencode($param) ."\">".$menu."</a> |";
    }
À la récupération, tu fais un urldecode() sur $_GET['m'] puis sur $_GET['p'] et on en parle plus.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 71 Messages

04 févr. 2007, 23:19

euh... Je me permets ? :P
Je trouve que tu t'enquiquines pas mal avec ces deux valeurs parce qu'une seule suffit... :lol:
<?php
	$menus = array
	(
		'menu 1' => array
		(
			'intitulé 1.1' => 'lien1-1.php',
			'intitulé 1.2' => 'lien1-2.php',
			'intitulé 1.3' => 'lien1-3.php'
		),
		'menu 2' => array
		(
			'intitulé 2.1' => 'lien2-1.php',
			'intitulé 2.2' => 'lien2-2.php',
			'intitulé 2.3' => 'lien2-3.php',
			'intitulé 2.4' => 'lien2-4.php'
		),
		'menu 3' => array
		(
			'intitulé 3.1' => 'lien3-1.php',
			'intitulé 3.2' => 'lien3-2.php'
		)
	);

	echo "\t<p>|";
	foreach($menus as $menu => $array)
        echo " <a href=\"index.php?m=".urlencode($menu)."\">".$menu."</a> |"; 
	echo "</p>\n";

	if(isset($_GET['m']))
	{
		$menu = urldecode($_GET['m']);

		echo "\t<ul>\n";
		foreach($menus[$menu] as $intitule => $url)
			echo "\t\t<li><a href=\"$url\">$intitule</a></li>\n";
		echo "\t</ul>\n";
	}
?>
Un grand merci en tout cas Cyrano pour m'avoir montré la voie à suivre... Il est vrai que je commençais à m'embourber bien comme il faut avec toutes ces boucles... :wink: