2010-01-30 5 views
0

Donc, ce que je suis en train de faire est de sélectionner tous les mois distincts de ma base de données, puis les imprimer dans une liste. Ça, je peux accomplir. Le problème réside dans le fait que j'ai besoin que ma liste soit à deux colonnes. La façon dont j'obtiens ceci avec CSS est en utilisant 2 div différents "left" et "right" qui sont flottants l'un à côté de l'autre. Cela pose un problème avec PHP car il doit faire écho à une div div et une nouvelle div ouverte après le sixième mois. Ensuite, il doit recommencer là où il s'est arrêté et finir. Je ne peux pas simplement énumérer tous les mois dans le HTML, soit parce que je ne veux pas qu'il liste un mois si je n'ai aucun enregistrement dans la DB pour ce mois, pour le moment. Des idées? J'espère que j'étais assez clair!Multi colonne dynamique PHP liste

Merci!

-williamg

+0

Avez-vous besoin des listes séparées triées ou formatées d'une manière ou d'une autre? –

+3

Meh, la foule de séparation de contenu/présentation nous avons tous courir pour utiliser des divs inappropriés. Ce sont des données tabulaires donc utilisez une table. – Mike

+0

De la question qu'il pose, je pense qu'il semble qu'il aurait la même difficulté à créer une table à deux colonnes. –

Répondre

2

Quelque chose comme cela devrait fonctionner (l'idée de base étant de garder juste un décompte des mois une augmentation comme vous en boucle à travers eux):

<div class="left"> 

<?php 
$x = 1; 
foreach($months as $month) { 

    # switch to the right div on the 7th month 
    if ($x == 7) { 
     echo '</div><div class="right">'; 
    } 

    echo "<div class=\"row\">{$month}</div>"; 

    # increment x for each row 
    $x++; 

} 

</div> 
0
<?php 
$numberOfMonths = count($months); 
$halfwayPoint = ceil($numberOfMonths/2); 

echo "<div class=\"left\">"; 
for($i=0; $i<$halfwayPoint; $i++){ 
     echo $months[$i] . "<br />"; 
} 
echo "</div><div class=\"right\">"; 

for($i=$halfwayPoint; $i<$numberOfMonths; $i++){ 
     echo $months[$i] . "<br />"; 
} 
echo "</div>"; 
?> 
0

Rant: Lors de l'affichage des données tabulaires, utilisez table au lieu de div flottant. Cela aura du sens si vous affichez la page avec css désactivé. Si vous utilisez div flotté, alors vos données seront affichées complètement. Pas tous l'utilisation table est mauvaise. Les gens détestent tellement table, donc l'utilisation flottait div. Table seulement mauvais lorsqu'il est utilisé pour la mise en page.

Rant: off

Lorsque je dois avoir un certain contenu affiché avec une certaine ouverture, fermeture, et entre caractère supplémentaire, je vais utiliser implode. C'est l'exemple:

$data = array('column 1', 'column 2'); 
$output = '<div>'.implode('</div><div>', $data).'</div>'; 
//result: <div>column 1</div><div>column 2</div> 

Vous pouvez l'étendre à presque tout. Array et implode est la puissance que PHP a depuis de nombreuses années. Vous n'aurez jamais besoin de if pour vérifier s'il s'agit du dernier élément, puis insérez le caractère de fermeture, ou vérifiez s'il s'agit du premier élément, puis insérez le caractère d'ouverture ou imprimez le caractère supplémentaire entre les éléments.

Espérons cette aide.

Mise à jour:

Mon mauvais pour mal interprété les principaux problèmes posées. Désolé pour la diatribe;) Voici mon code pour faire une données affichées dans 2 colonnes:

//for example, I use array. This should be a result from database 
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9); 
//should be 12 month, but this case there are only 9 of it 

for ($i = 0; $i <= 5; $i++) 
{ 
    //here I do a half loop, since there a fixed number of data and the item for first column 
    $output = '<div class="left">'.$data[$i].'</div>'; 
    if (isset($data[$i+6]) 
    { 
    $output = '<div class="right">'.$data[$i+6].'</div>'; 
    } 
    echo $output."\n"; 
} 
//the result should be 
//<div class="left">1</div><div class="right">7</div> 
//<div class="left">2</div><div class="right">8</div> 
//<div class="left">3</div><div class="right">9</div> 
//<div class="left">4</div> 
//<div class="left">5</div> 
//<div class="left">6</div> 

Autre solution utilise CSS pour formater la sortie, de sorte que vous mettez juste le div haut en bas, puis le css faites en sorte que le conteneur parent corresponde verticalement à l'élément 6 et placez le reste à droite du contenu existant. Je ne sais pas grand-chose à ce sujet, car il est généralement fourni par un collègue concepteur CSS ou mon client.

+0

Rant: on Ce ne sont pas vraiment des données tabulaires. La valeur de la ligne 1, colonne 1 n'a rien à voir avec la valeur de la ligne 1, colonne 2. Les données tabulaires seraient mois/# de jours ou mois/mois en espagnol. Quel serait le thead? Et le tbody? Y a-t-il des cellules th? Il utilise des colonnes pour la conception/la mise en page et les tableaux ne seraient donc pas appropriés. Rant: off –

+1

Ok, merci de le signaler. J'ai mal lu la question, désolé. J'ai mis à jour ma réponse ci-dessus. –

0

L'exemple suppose que vous avez un tableau d'objets.

<div style="width:150px; float:left;"> 
<ul> 
<?php 

$c = count($categories); 

$s = ($c/3); // change 3 to the number of columns you want to have. 

$i=1; 
foreach($categories as $category) 
{ 
    echo '<li>' . $category->CategoryLabel . '</a></li>'; 
    if($i != 0 && $i % $s == 0) 
    { 
     ?> 
     </ul> 
     </div> 
     <div style="width:150px; float:left;"> 
     <ul> 
     <?php 
    } 
    $i++; 
} 

?> 
</ul> 
</div>