Partager Boucle ?

Eléphanteau du PHP | 18 Messages

20 janv. 2007, 14:29

Bonjour,

J'ai créé 3 divs avec une classe "colonne" pour faire 3 colonnes sur ma page.

Code : Tout sélectionner

.colonne { float: left; width: 32%; margin-left: 1%; }

Code : Tout sélectionner

<div class="colonne"></div> <div class="colonne"></div> <div class="colonne"></div>
J'ai une boucle foreach qui parcours un array. En fait, mon problème serait d'afficher 1 résultat dans chaque divs.
C'est à dire:

Code : Tout sélectionner

<div class="colonne">Résultat 1 - Résultat 4 - Résultat 7</div> <div class="colonne">Résultat 2 - Résultat 5 - Résultat 8</div> <div class="colonne">Résultat 3 - Résultat 6 - Résultat 9</div>
Quelque chose qui donnerait ca:

Image

Il faudrait que j'affiche les résultats comme dit plus haut, un dans caque div puis on recommence. J'avoue bloquer là, surtout que les résultats peuvent venir de plusieurs boucles différentes.


Merci d'avance ;)
A bientôt,

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 janv. 2007, 14:44

Pourquoi ne pas utiliser un tableau ? ça semble mieux adapté du coup

Cherche sur le forum, style "tableau + modulo", tu auras plusieurs sujets qui indiquent comment étaler les résultats.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 janv. 2007, 14:45

Salut,

Faudrait plus de détails sur la provenance des données mais à priori un passage par la programmation est inévitable.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 18 Messages

20 janv. 2007, 15:00

Salut, merci d'avoir répondu,

Oui je souhaite bien passer par PHP pour fair ceci, c'était juste pour montrer comme étaler mes données.

Par exemple j'ai:

Code : Tout sélectionner

$exp = array('Lien 1', 'Lien 2', 'Lien 3'); echo '<div class="resultat">'."\n".'<ul>'; foreach($exp as $element) { echo '<li>'.$element.'</li>'."\n"; } echo '</ul>'."\n".'</div>';
Et admettons que j'ai une autre boucle du style:

Code : Tout sélectionner

$exp = array('Paragraphe 1', 'Paragraphe 2', 'Paragraphe 3'); foreach($exp as $element) { echo '<div class="resultat">'.$element.'</div>'; }
Ce qui me donnerait un code de ce style là:

Code : Tout sélectionner

<div class="resultat"> <ul> <li>Lien 1</li> <li>Lien 2</li> <li>Lien 3</li> </ul> </div> <div class="resultat"> Paragraphe 1 </div> <div class="resultat"> Paragraphe 2 </div> <div class="resultat"> Paragraphe 3 </div>
Je me retrouverais donc avec 4 divs "resultat", j'aimerais les départager pour afficher 1 div "resultat" dans chaque div "colonne" (il y en 3 pour faire les 3 colonnes sur la page).

Ce qui me donnerait donc au final:

Code : Tout sélectionner

<div class="colonne"> <div class="resultat"> <ul> <li>Lien 1</li> <li>Lien 2</li> <li>Lien 3</li> </ul> </div> <div class="resultat"> Paragraphe 3 </div> </div> <div class="colonne"> <div class="resultat"> Paragraphe 1 </div> </div> <div class="colonne"> <div class="resultat"> Paragraphe 2 </div> </div>
Merci pour vos réponses,
A bientôt,[/code]

Eléphant du PHP | 281 Messages

20 janv. 2007, 15:42

---
Modifié en dernier par Ouaibou le 07 juil. 2007, 11:10, modifié 1 fois.

Mammouth du PHP | 983 Messages

20 janv. 2007, 16:02

Ps : Je me rappel plus trop mais il me semble qu'on pourrait remplacer le switch par une seule affectation vu qu'on fait la même chose dans les trois cas, par un truc du genre : $container{($mod + 1)} .= $value, mais j'en suis pas sur.

@+
Tout à fait, mais l'indirection c'est plutôt illisible quand tu reviens sur le script une semaine plus tard ;) Avec un tableau, on peut éviter le switch:
<?php
    $data = array('paf', 'plouf', 'plif', 'pof', 'toto');

    $container[0] = '';
    $container[1] = '';
    $container[2] = '';

    foreach($data as $key => $value) {
        $mod = $key % 3;
        $container[$mod] .= $value.'<br />';
        
    }
	
    echo $container[0].'<br /><br />';
    echo $container[1].'<br /><br />';
    echo $container[2];
?>

Eléphanteau du PHP | 18 Messages

20 janv. 2007, 16:26

Salut, Merci ca marche parfaitement.

Cependant, j'ai encore un petit problème pour mon $value.
A la base je faisais comme cela:
foreach($exp as $element)
{
	$rss = simplexml_load_file($element);
	include('rss.php');
}

Maintenant j'ai essayé d'adapter ca comme je peux mais j'ai un problème, je ne vois pas si c'est bien comme ca qu'il faut faire:
$container[0] = '<div class="colonne">';
$container[1] = '<div class="colonne">';
$container[2] = '<div class="colonne">';
	
foreach($exp as $key => $value)
{
	$mod = $key % 3;
	$rss = simplexml_load_file($value);
	$value = include('rss.php');
	$container[$mod] .= $value.'<br />';
			
}
		
echo $container[0].'</div>';
echo $container[1].'</div>';
echo $container[2].'</div>';
Il y a sûrement une erreur ici.
A oui, dans ma page rss je traite mon flux de la facon suivante:
foreach ($rss->channel->item as $item)
Merci ;)

Mammouth du PHP | 983 Messages

20 janv. 2007, 17:12

Est ce que tu fais bien un "return" à la fin du fichier rss.php ?

Ce n'est pas une bonne pratique que de récupérer la valeur de retour d'include, il vaut mieux passer par une fonction, c'est plus clair.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

20 janv. 2007, 17:22

Ce n'est pas une bonne pratique que de récupérer la valeur de retour d'include [...]
Loin de moi l'idée de détourner le sujet, mais je pense exactement le contraire. Si un fichier PHP contient des données alors je trouve qu'il est préférable de les récupérer via un return, de façon à ne pas polluer les variables du "scope" actuel. De cette façon, le fichier de données reste 100% inerte et ne risque aucun conlits.

Voilà mon opinion, je vous laisse retourner au sujet en cours, que je n'ai pas lu sinon je proposerais déjà d'utiliser XSLT à la place :lol:

Eléphanteau du PHP | 18 Messages

20 janv. 2007, 18:05

Salut, l'erreur ne serait pas plutôt dans le code suivant ?
foreach($exp as $key => $value)
{
    $mod = $key % 3;
    $rss = simplexml_load_file($value);
    $value = include('rss.php');
    $container[$mod] .= $value.'<br />';
            
} 
Sinon voici la structure de ma page rss.php
foreach ($rss->channel->item as $item)
{

echo '<a href="'.utf8_decode($link).'">'.utf8_decode($item->title).'</a>';
}
	
return;
Merci bien;[/php]

Eléphanteau du PHP | 18 Messages

21 janv. 2007, 13:22

Pas d'idée ? Je ne vois vraiment pas comment faire pour que $value soit le fichier rss.php.
Merci,

Mammouth du PHP | 505 Messages

21 janv. 2007, 19:02

Au lieu de faire un echo, tu affectes le résultat dans une variable puis tu fais un return de cette variable.

Mais comme dis plus haut, c'est plutot ue manière de codé douteuse.

Il vaudrait mieux que ton rss soit une fonction, et tu appel ta fonction qd tu en as besoin.


// Contenu de rss.php
function genRss($rss) {
$result='';
foreach ($rss->channel->item as $item)
{

$result .= '<a href="'.utf8_decode($link).'">'.utf8_decode($item->title).'</a>';
}
    
return $result;
}
et appel dans ton code
include('rss.php');
foreach($exp as $key => $value)
{
    $mod = $key % 3;
    $rss = simplexml_load_file($value);
    $value = genRss($rss);
    $container[$mod] .= $value.'<br />';
            
}