Page 1 sur 1

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

Posté : 02 févr. 2007, 00:38
par Chakra Spirit
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 ? :)

Posté : 02 févr. 2007, 02:29
par Ajoloca
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

Posté : 02 févr. 2007, 10:00
par Chakra Spirit
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... :?

Posté : 02 févr. 2007, 10:04
par mcorgnet
.= est une concaténation
+= est une addition

Posté : 02 févr. 2007, 10:12
par Chakra Spirit
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 :)

Posté : 03 févr. 2007, 18:47
par Chakra Spirit
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";
	}
?>

Posté : 04 févr. 2007, 11:23
par Chakra Spirit
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... :?

Posté : 04 févr. 2007, 19:29
par Chakra Spirit
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() ...

Posté : 04 févr. 2007, 20:22
par Chakra Spirit
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";
				}
?>

Posté : 04 févr. 2007, 21:49
par Cyrano
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.

Posté : 04 févr. 2007, 23:19
par Chakra Spirit
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: