Rechercher : dans
Par :

[PHP] utilisation du foreach

Dernière réponse le 21 avr 2009 à 20:05:14 okuni, le 4 oct 2008 à 16:01:17 
 Signaler ce message aux modérateurs

Bonjour,

Je me suis dis que ce serai pratique d'utiliser foreach pour passer au regex toutes mes variables avant de les afficher.

Dans cette exemple, il s'agit d'un chat.
je récupère les données de ma table puis le foreach.
la page regex.php contient toutes les regex (elles fonctionnent)

$query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page";
$result = mysql_query($query)or die (mysql_error());

$css = 'clair';

// Puis on fait une boucle pour afficher tous les résultats :
while ($donnees = mysql_fetch_array($result) )
{
	foreach ($donnees as $element)
	{
		include ('../includes/regex.php');
	}

[affichage des données]


Mais voila, sa ne fonctionne pas :p

Quelqu'un pourrait m'aider? L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Meilleures réponses pour « [PHP] utilisation du foreach » dans :
Comment enlever la version de PHP : X-Powered-By: PHP/4.1.0 ? VoirPar défaut, PHP est configure pour envoyer un en-tête HTTP appelé X-Powered-By, donnant la version de PHP utilisée. Pour supprimer cet en-tête, il suffit de modifier l'option expose_php dans le fichier php.ini de la manière suivante : expose_php...
[PHP] Notice: Undefined index: VoirSi vous utilisez les tableaux $_POST ou $_GET pour récupérer les variables de vos formulaires ou autres, il se peut que vous tombiez sur cette erreur: Notice: Undefined index 'champs du tableau' in 'chemin du fichier php en cours d'execution' on line...
[PHP] Headers already sent by..... VoirLorsque vous utilisez une fonction PHP qui manipule les en-têtes HTTP comme par exemple: header() setcookie() session_start() Il est important d'utiliser ces fonctions avant d'avoir généré le moindre flux vers le client. A partir du moment où...
Télécharger PHP FTP Synchronizer VoirLa mise à jour de site web est aussi complexe que sa conception. Alors il faut utiliser le bon outil avec les bon paramètres et une bonne connaissance de programmation pour mettre à jour un site. PHP FTP Synchronizer est une application vous...
PHP - Les variables VoirConcept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...
PHP - Parser du XML VoirIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
PHP - Les classes VoirLa notion de classe Php3 intègre un soupçon de caractéristiques empruntées aux langages orientés objet, c'est-à-dire la possibilité d'utiliser des objets, entités regroupant des données et des fonctions au sein d'une structure et rendant la...

1

Groarh, le 4 oct 2008 à 16:13:20

Vérifie que ton serveur gère le php 5 par défaut.
Sinon, il faut mettre l'extension .php5 à ton script.

Répondre à Groarh

2

okuni, le 4 oct 2008 à 16:23:58

Foreach ne fonctionne que sous PHP5 ? L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

3

Groarh, le 4 oct 2008 à 17:09:41

Ben oui :)

Répondre à Groarh

4

okuni, le 5 oct 2008 à 16:53:27

Ok

mais même quand je met l'extension .php5 celà ne fonctionne pas. Cela signifie que mon hébergeur ne gère pas PHP5? L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

5

Groarh, le 6 oct 2008 à 10:11:11

C'est quoi ton hébergeur ? J'ai envie de dire, c'est du carton-pâte...
Pour être fixé utilise phpinfo() dans un fichier d'extension .php5, et tu sauras.

P.S. Même, eh oui même Free est passé au php 5 !!! Change d'hébergeur, conseil d'ami ;)

Répondre à Groarh

6

okuni, le 6 oct 2008 à 19:28:12

Ben justement, je suis chez Free :p L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

7

Groarh, le 6 oct 2008 à 19:35:09

Ah. *gros blanc*

Eh bien, change de boucle... ^^
Moi aussi je suis chez Free mais comme je n'ai découvert le foreach que récemment, je faisais à l'ancienne :

for ($i = 0; i <= $donnees.length - 1; i++) {
  $element = $donnees[$i];
  include('../includes/regex.php');
}


Et tant que j'y suis, c'est pas un problème d'include ? J'ai toujours des emmerdes pas possibles avec cette histoire de chemin d'include que Free ne permet pas de modifier...

Répondre à Groarh

8

okuni, le 6 oct 2008 à 20:38:59

Ok merci, je vais tester ce code ce soir.

$donnees.length est égal a quoi?

et non c'est pas un problème d'includes même si parfois j'en ai lol
mais le seul problème que j'ai eu avec les includes sur Free c'est avec un lien absolu (je sais plus je pense; un lien complet quoi :p) L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

9

Dr Zoidberg, le 6 oct 2008 à 21:32:11

Pour info foreach existe depuis PHP4
http://fr.php.net/foreach

Répondre à Dr Zoidberg

10

okuni, le 6 oct 2008 à 21:40:19

Merci pour l'info.
Mais s'a n'explique pas pourquoi mon code ne marche pas. L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

11

Stef60, le 6 oct 2008 à 21:55:34

Bonsoir,
tu obtiens une erreur ?
On peux avoir un aperçu du fichier regex.php ?

Répondre à Stef60

12

okuni, le 6 oct 2008 à 22:11:24

Non aucun message d'erreur.

voila le code (l'autre version :p)

for ($i = 0; $i <= 1; $i++ )
	{
		$element = $donnees['$i'];
		include ('../includes/regex.php');
		$donnees['$i'] = $element;
	}

mais ce code ne fonctionne pas.

voici le regex mais j'ai essayé avec ce qui suit et tout marche donc ce n'est pas ma page de regex. (enfin, je pense :p)
$element = $donnees['comment'];
		include ('../includes/regex.php');
		$donnees['comment'] = $element;


ma page regex :
$element = preg_replace('#\[b\](.+)\/b\#isU', '<strong>$1</strong>', $element);//gras
		$element = preg_replace('#\[i\](.+)\/i\#isU', '<em>$1</em>', $element);//italique
		$element = preg_replace('#\[u\](.+)\/u\#isU', '<u>$1</u>', $element);//souligné
		$element = preg_replace('#\[q\](.+)\/q\#isU', '<q>$1</q>', $element);//citation
		$element = preg_replace('#\[center\](.+)\/center\#isU', '<div style="text-align:center">$1</div>', $element);//centré
		$element = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)\](.+)\/color\#isU', '<span style="color:$1">$2</span>', $element);//couleur
		$element = preg_replace('#\[url=http://(.+)\](.+)\/url\+#isU', '<a href="http://$1">$2</a>', $element);//lien
		$element = preg_replace('#\[url\]http://(.+)\/url\+#isU', '<a href="http://$1">$1</a>', $element);//lien
		$element = preg_replace('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#isU', '<a href="mailto:$0">$0</a>', $element);//mail
		$element = preg_replace('#\[img\](.+)\/img\#isU', '<img src="$1" alt="$1" />', $element);//image
		
		//regex des smileys
		$element = preg_replace('#:D#isU', ' <img src="../images/smileys/biggrin.gif" alt=":D" /> ', $element);
		$element = preg_replace('#XD#isU', ' <img src="../images/smileys/XD.png" alt="XD" /> ', $element);
		$element = preg_replace('#:\)#isU', ' <img src="../images/smileys/smile.gif" alt=":)" /> ', $element);
		$element = preg_replace('#:\(#isU', ' <img src="../images/smileys/sad.gif" alt=":(" /> ', $element);
		$element = preg_replace('#:cool:#isU', ' <img src="../images/smileys/cool.gif" alt=":cool:" /> ', $element);
		$element = preg_replace('#:o#isU', ' <img src="../images/smileys/ohmy.gif" alt=":o" /> ', $element);
		$element = preg_replace('#Zz#isU', ' <img src="../images/smileys/sleep.gif" alt="Zz" /> ', $element);
		$element = preg_replace('#:p#isU', ' <img src="../images/smileys/tongue.gif" alt=":p" /> ', $element);
		$element = preg_replace('#;\)#isU', ' <img src="../images/smileys/wink.gif" alt=";)" /> ', $element);
		$element = preg_replace('#\^\^#isU', ' <img src="../images/smileys/happy.gif" alt="^^" /> ', $element);

ps : commentsamarche.com transforme les [ et ] donc le code est un peu moins visibles :s L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

13

Stef60, le 6 oct 2008 à 22:17:03

Tu dis : ca ne fonctionne pas.
Tu obtiens quoi ? une erreur ? rien qui s'affiche ?
Ca pourrait donner une piste ;-)

Répondre à Stef60

14

okuni, le 6 oct 2008 à 22:18:24

Oui déso. j'ai aucun message d'erreur mais toutes mes données s'affiche correctement. L'amour, c'est comme les spaghettis; quand c'est mou, c'est ­cuit. (proverbe belge)

Répondre à okuni

15

donuts08, le 6 oct 2008 à 23:24:33

Bonjour,

faire des tests, des tests et encore des tests, ya que ce moyen qui est efficace pour trouver des bugs quand aucun message n'apparait! Mets des echos un peu partout pour voir au fur et à mesure de ton programme où sont les problèmes...

Répondre à donuts08

16

okuni, le 7 oct 2008 à 08:36:42

On avance :p
sa marche mais seulement avec les echo :/

for ($i = 0; $i <= 1; $i++ )
	{
		$element = $donnees[$i];
		echo 'element 1 :'.$element.'<br/>';
		include ('../includes/regex.php');
		echo 'element 2 :'.$element.'<br/>';
		$donnees[$i] = $element;
		echo 'donnees :'.$donnees[$i].'<br/>';
	}

si j'enlève les 3 echo, le script ne fonctionne plus :s
Je comprend pas du tout

EDIT : J'ai réfléchi et en fait, il y a une confusion car dans le for j'utilise la numérotation mais dans mon code pour afficher les données, c'est avec les mot clef.
Y a-t-il un moyen de revenir au mot clef, c'est quand même plus pratique que les numéros :p L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

17

Groarh, le 7 oct 2008 à 11:23:10
  • +2

Okuni,
ça m'a l'air un peu confus tout ça dans ta tête :P
Je vais reprendre à partir du bout de code que tu donnes dans le post n°12.

Alors, $donnees est un tableau contenant une ligne de la base de données. Comme tout tableau qui se respecte, il a un nombre d'éléments accessible via sa propriété length, c'est ce que tu demandais plus haut :
donnees.length est le nombre d'éléments du tableau. (je vais l'appeler n)

Pour passer le regexp à tous les éléments, il est donc nécessaire d'itérer sur tous les éléments : on part de 0 (le 1er élément) et on va jusqu'à n - 1 (le n-ième élément).

for ($i = 0; i <= donnees.length - 1; $i++)

Ça va, tu suis ?
Là ça corrige déjà un problème : tu n'allais que jusqu'à 1.

Ensuite :
$element = $donnees[$i];

Là je corrige quoi ? > j'ai viré les guillemets ^^
Si tu mets des guillemets, PHP cherche dans le tableau une valeur portant la clé '$i' en toutes lettres, et pas le numéro porté par $i. Résultat : il ne trouve pas, il renvoie null et donc $element = null quand il arrive dans le regexp. Ensuite il fait un preg_replace sur ce null, et comme ça ne le dérange pas plus que ça, il ne déclenche pas de message d'erreur : il renvoie null lui aussi.
Tu suis toujours ? ^^

Enfin, d'après ce que j'ai compris, ton script va afficher les données à partir du tableau $donnees, qui a été modifié par le passage du regexp. Donc à la fin d'un tour de boucle, la valeur $element retourne dans $donnees[$i]. Eh oui, tu as mis aussi des guillemets ! Du coup il stocke la valeur dans une case du tableau portant la clé '$i' en toutes lettres, dont tu ne te sers pas après (puisque tu ne sais pas qu'elle existe :D)
Retire les guillemets et ça sera stocké au bon endroit ;)

Le script final :
for ($i = 0; $i <= $donnees.length - 1; $i++ )
	{
		$element = $donnees[$i];
		include ('../includes/regex.php');
		$donnees[$i] = $element;
	}

Dis-moi si ça marche :P

Répondre à Groarh

18

okuni, le 7 oct 2008 à 18:01:51

Merci beaucoup pour ta réponse mais sa ne marche pas.
J'ai peut-être oublié quelque chose alors voila le code dans son intégrale.

<?php
//Pagination des pages
include ('../includes/pagination.php');
	
$query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page";
$result = mysql_query($query)or die (mysql_error());

$css = 'clair';

// Puis on fait une boucle pour afficher tous les résultats :
while ($donnees = mysql_fetch_array($result) )
{
	if ($css == 'clair')
	{
		$css = 'fonce';
	}
	else
	{
		$css = 'clair';
	}
	
	for ($i = 0; $i <= $donnees.length - 1; $i++ )
	{
		echo 'donnees 1 : '.$donnees[$i].'<br/>';
		$element = $donnees[$i];
		echo 'element 1 : '.$element.'<br/>';
		include ('../includes/regex.php');
		echo 'element 2 : '.$element.'<br/>';
		$donnees[$i] = $element;
		echo 'donnees 2 : '.$donnees[$i].'<br/>';
	}
	
	?>
	<table width="100%" style="text-align:left;">
		<tr>
			<td class="<?php echo $css;?>"><b><?php echo $donnees['pseudo']; ?></b> : <?php echo $donnees['comment']; ?></td>
		</tr>
	</table>
	<?php
}
?>

J'ai mis des écho pour voir les données mais il n'y a rien qui s'affiche.

En testant, j'ai vu que $donnees.length ne fonctionne pas car j'ai remplacé par 1 (j'ai 2 donnée différente, le pseudo et le message) et les regex marchaient. avec ce code :
for ($i = 0; $i <= 1; $i++ )
	{
		$element = $donnees[$i];
		include ('../includes/regex.php');
		$donnees[$i] = $element;
	}
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

19

Stef60, le 8 oct 2008 à 19:45:52

Salut,

meme question que ton poste 8:
$donnees.length est égal a quoi?
C'est un chiffre?

Répondre à Stef60

20

okuni, le 8 oct 2008 à 20:38:08

Je ne sais pas, quand je fais un echo, il ne me met rien

for ($i = 0; $i <= $donnees.length - 1; $i++ )
	{
		echo '$donnees.length : '.($donnees.length).'<br/>';
		echo 'donnees 1 : '.$donnees[$i].'<br/>';
		$element = $donnees[$i];
		echo 'element 1 : '.$element.'<br/>';
		include ('../includes/regex.php');
		echo 'element 2 : '.$element.'<br/>';
		$donnees[$i] = $element;
		echo 'donnees 2 : '.$donnees[$i].'<br/>';
	}


et les autre echo ne me donne rien non plus. L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

Répondre à okuni

24

Alain_42, le 9 oct 2008 à 11:30:40

Salut,

tu fais une boucle

et à chaque passage de la boucle tu fais un include du même fichier
Utilité ????

tu connais les fonctions en php alors essayes comme ça en metant ta preReplace dans une fonction que tu vas appeler à chaque passage de la boucle:

// la fonction
function remplacement($chaine){
	$chaine = preg_replace('#\[b\](.+)\/b\#isU', '<strong>$1</strong>', $chaine);//gras
	$chaine = preg_replace('#\[i\](.+)\/i\#isU', '<em>$1</em>', $chaine);//italique
	$chaine = preg_replace('#\[u\](.+)\/u\#isU', '<u>$1</u>', $chaine);//souligné
	$chaine = preg_replace('#\[q\](.+)\/q\#isU', '<q>$1</q>', $chaine);//citation
	$chaine = preg_replace('#\[center\](.+)\/center\#isU', '<div style="text-align:center">$1</div>', $chaine);//centré
	$chaine = preg_replace('#\[color=(red|green|blue|yellow|purple|olive)\](.+)\/color\#isU', '<span style="color:$1">$2</span>', $chaine);//couleur
	$chaine = preg_replace('#\[url=http://(.+)\](.+)\/url\+#isU', '<a href="http://$1">$2</a>', $chaine);//lien
	$chaine = preg_replace('#\[url\]http://(.+)\/url\+#isU', '<a href="http://$1">$1</a>', $chaine);//lien
	$chaine = preg_replace('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#isU', '<a href="mailto:$0">$0</a>', $chaine);//mail
	$chaine = preg_replace('#\[img\](.+)\/img\#isU', '<img src="$1" alt="$1" />', $chaine);//image
		
		//regex des smileys
	$chaine = preg_replace('#:D#isU', ' <img src="../images/smileys/biggrin.gif" alt=":D" /> ', $chaine);
	$chaine = preg_replace('#XD#isU', ' <img src="../images/smileys/XD.png" alt="XD" /> ', $chaine);
	$chaine = preg_replace('#:\)#isU', ' <img src="../images/smileys/smile.gif" alt=":)" /> ', $chaine);
	$chaine = preg_replace('#:\(#isU', ' <img src="../images/smileys/sad.gif" alt=":(" /> ', $chaine);
	$chaine = preg_replace('#:cool:#isU', ' <img src="../images/smileys/cool.gif" alt=":cool:" /> ', $chaine);
	$chaine = preg_replace('#:o#isU', ' <img src="../images/smileys/ohmy.gif" alt=":o" /> ', $chaine);
	$chaine = preg_replace('#Zz#isU', ' <img src="../images/smileys/sleep.gif" alt="Zz" /> ', $chaine);
	$chaine = preg_replace('#:p#isU', ' <img src="../images/smileys/tongue.gif" alt=":p" /> ', $chaine);
	$chaine = preg_replace('#;\)#isU', ' <img src="../images/smileys/wink.gif" alt=";)" /> ', $chaine);
	$chaine = preg_replace('#\^\^#isU', ' <img src="../images/smileys/happy.gif" alt="^^" /> ', $chaine);
	
return $chaine;	
}


//ton code de départ  oui la fonction foreach existait et fonctionnait en php4 !!
$query = "SELECT pseudo,comment FROM raynal_chat ORDER BY id DESC LIMIT $premier_message, $nombre_entree_par_page";
$result = mysql_query($query)or die (mysql_error());

$css = 'clair';

// Puis on fait une boucle pour afficher tous les résultats :
while ($donnees = mysql_fetch_array($result) )
{
	foreach ($donnees as $element)	{
               // un petit appel de la fonction
		$element=remplacement($element);
             //affichage des données
           echo "Element: ".$element."<br />";
	
   }
}


@lain

Répondre à Alain_42
Collection CommentÇaMarche.net