Page 1 sur 1

Partager Boucle ?

Posté : 20 janv. 2007, 14:29
par Nonoteam
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,

Posté : 20 janv. 2007, 14:44
par ouckileou
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.

Posté : 20 janv. 2007, 14:45
par Truc
Salut,

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

Posté : 20 janv. 2007, 15:00
par Nonoteam
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]

Posté : 20 janv. 2007, 15:42
par Ouaibou
---

Posté : 20 janv. 2007, 16:02
par rami
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];
?>

Posté : 20 janv. 2007, 16:26
par Nonoteam
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 ;)

Posté : 20 janv. 2007, 17:12
par rami
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.

Posté : 20 janv. 2007, 17:22
par Hubert Roksor
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:

Posté : 20 janv. 2007, 18:05
par Nonoteam
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]

Posté : 21 janv. 2007, 13:22
par Nonoteam
Pas d'idée ? Je ne vois vraiment pas comment faire pour que $value soit le fichier rss.php.
Merci,

Posté : 21 janv. 2007, 19:02
par titerm
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 />';
            
}