besoin d'imprimer la liste 5 de la colonne dans l'ordre alpha, à la verticale

StackOverflow https://stackoverflow.com/questions/3040565

  •  27-09-2019
  •  | 
  •  

Question

Avoir une page Web qui sera vu par IE principalement les utilisateurs, donc CSS3 est hors de question.

Je veux à la liste comme:

A  D  G
B  E  H
C  F  I

Voici la fonction actuellement des listes comme:

A B C
D E F
G H I

function listPhoneExtensions($group,$group_title) {
  $adldap = new adLDAP();
  $group_membership = $adldap->group_members(strtoupper($group),FALSE);

    sort($group_membership);
    print "
    <a name=\"".strtolower($group_title)."\"></a>
    <h2>".$group_title."</h2>
    <ul class=\"phone-extensions\">";
  foreach ($group_membership as $i => $username) {
      $userinfo = $adldap->user_info($username, array("givenname","sn","telephonenumber"));
      $displayname = "<span class=\"name\">".substr($userinfo[0]["sn"][0],0,9).", ".substr($userinfo[0]["givenname"][0],0,9)."</span><span class=\"ext\">".$userinfo[0]["telephonenumber"][0]."</span>";
      if($userinfo[0]["sn"][0] != "" && $userinfo[0]["givenname"][0] != "" && $userinfo[0]["telephonenumber"][0] != "") {
        print "<li>".$displayname."</li>";
      }
    }
    print "</ul><p class=\"clear-both\"><a href=\"#top\" class=\"link-to-top\">&uarr; top</a></p>";
}

Exemple rendu html:

<ul class="phone-extensions">
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li>
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li>
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li>
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li>
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li>
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li>
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li>
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li>
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li>
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li>
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li>
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li>
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li>
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li>
<li><span class="name">Barry Bonds</span><span class="ext">8281</span></li>
<li><span class="name">Gerald Clark</span><span class="ext">8211</span></li>
<li><span class="name">Juan Dixon</span><span class="ext">8282</span></li>
<li><span class="name">Omar Ebbs</span><span class="ext">8252</span></li>
<li><span class="name">Freddie Flank</span><span class="ext">2281</span></li>
<li><span class="name">Jerry Gilmore</span><span class="ext">4231</span></li>
<li><span class="name">Kim Moore</span><span class="ext">5767</span></li>
</ul>

Toute aide est appréciée à l'obtenir à la liste alpha verticalement.

Était-ce utile?

La solution

Je charger les données critiques dans un tableau afin que vous puissiez les compter et pas à travers eux dans l'ordre que vous voulez. Ensuite, utilisez un algorithme comme celui-ci pour les obtenir dans l'ordre:

$items = BuildItemArray(); // Get the values into an array.
$columnCount = 5;
$itemCount = count($items);

$rowCount = ceil($itemCount / $columnCount);
for ($i = 0; $i < $rowCount * $columnCount; $i++)
{
    $index = ($i % $columnCount) * $rowCount + floor($i / $columnCount);
    if ($index < $itemCount)
    {
        DisplayItem($items[$index]);
    }
    else
    {
        DisplayBlank();
    }
}

Je pense qu'il faut travailler, mais je ne l'ai pas testé.

Autres conseils

Je poste ma réponse à cette vieille question pour les raisons suivantes:

  1. Ma réponse est plus générale et facile pour les autres de s'adapter.
  2. Je ne voulais pas une solution trop complexe.
  3. Mon tableau était associatif, avec une clé de chaîne. BTW, ma solution fonctionnera pour les deux tableaux associatifs et indexés.

En fait, la solution que je suis venu avec était assez simple - utiliser plusieurs balises avec style = « float: left », à l'intérieur d'une table géante. Alors que j'étais sceptique que d'avoir plusieurs balises tbody dans une seule table passerait la validation HTML, en fait ne passe sans erreur.

Notez les points suivants

  • $ numCols est le nombre désiré de colonnes.
  • Puisque nous flottons articles, vous devrez peut-être définir la largeur et min-largeur des éléments parents et / ou ajouter un peu
    style="clear: both", en fonction de votre situation.
  • pour les méthodes de tri alternatives, consultez http://php.net/manual/en/ array.sorting.php

Voici ma réponse complète:

function sortVertically( $data = array() )
{
    /* PREPARE data for printing */
    ksort( $data );     // Sort array by key.
    $numCols    = 5;    // Desired number of columns
    $numCells   = is_array($data) ? count($data) : 1 ;
    $numRows    = ceil($numCells / $numCols);
    $extraCells = $numCells % $numCols;  // Store num of tbody's with extra cell
    $i          = 0;    // iterator
    $cCell      = 0;    // num of Cells printed
    $output     = NULL; // initialize 


    /* START table printing */
    $output     .= '<div>';
    $output     .= '<table>';

    foreach( $data as $key => $value )
    {
        if( $i % $numRows === 0 )   // Start a new tbody
        {
            if( $i !== 0 )          // Close prev tbody
            {
                $extraCells--;
                if ($extraCells === 0 )
                {
                    $numRows--;     // No more tbody's with an extra cell
                    $extraCells--;  // Avoid re-reducing numRows
                }
                $output .= '</tbody>';
            }

            $output .= '<tbody style="float: left;">';
            $i = 0;                 // Reset iterator to 0
        }
        $output .= '<tr>';
            $output .= '<th>'.$key.'</th>';
            $output .= '<td>'.$value.'</td>';
        $output .= '</tr>';

        $cCell++;                   // increase cells printed count
        if($cCell == $numCells){    // last cell, close tbody
            $output .= '</tbody>';
        }

        $i++;
    }

    /* FINISH table printing */
    $output .= '</table>';
    $output .= '</div>';
    return $output;
}

J'espère que cette réponse vous sera utile un jour.

Le titre indique 5 colonnes, mais votre exemple montre 3. Je suppose 3.

Après le stockage de vos données dans un tableau, et les trier, procédez comme suit:

Pour 3 colonnes, vous voulez la position 0,3,6 sur la même ligne. La ligne suivante aura pas de 1 de chacune de ces valeurs. Ainsi, 1,4,7. La ligne suivante sera 2,5,8.

Par conséquent, vous pouvez changer votre boucle pour tenir 3 valeurs initialement. 0,3,6, puis incrémenter chaque, et de créer la ligne suivante.

Voici ce qui a fonctionné pour moi. Notez que les colonnes sont modifiées en fonction de la rowCount après sa découverte sur la I ligne intitulée (// ajoutée). Vous pouvez voir que je me sers d'une ScreenWidth et ItemWidth pour calculer mon nombre de colonnes.

Un problème se produit lorsque le nombre d'éléments vides est supérieur au nombre de lignes. Si j'ai 8 colonnes et 17 fiches-je obtenir 3 lignes (plafond (17/8) = 3). Ceci est un problème (3 * 8) - 17 = 7 enregistrements vides. Et voici ce qui se passe:

RECORD RECORD RECORD RECORD RECORD RECORD ------ ------
RECORD RECORD RECORD RECORD RECORD RECORD ------ ------
RECORD RECORD RECORD RECORD RECORD ------ ------ ------

Comme les lignes sont 3 puis la ligne de code que je fixe des choses ajouté:

columnCount = Math.Ceiling(itemCount / rowCount);

columnCount = 17/3 Plafond = 6 (colonnes) donc ma mise en page rend comme suit (mon client fonctionne la largeur).

RECORD RECORD RECORD RECORD RECORD RECORD  
RECORD RECORD RECORD RECORD RECORD RECORD 
RECORD RECORD RECORD RECORD RECORD ------ 

Si tout va bien qui aide à toute personne qui faisait face à mon problème.

    private List<CompanyCourseViewModel> Reorder(List<CompanyCourseViewModel> courses, Decimal width, Decimal itemWidth)
    {
        var list = new List<CompanyCourseViewModel>();
        var columnCount = Math.Floor(width / itemWidth);
        var itemCount = courses.Count();
        var rowCount = Math.Ceiling(itemCount / columnCount);
        columnCount = Math.Ceiling(itemCount / rowCount); // Added line.

        for (var i = 0; i < rowCount * columnCount; i++)
        {
            var index = (int) ((i%columnCount) * rowCount + Math.Floor(i/columnCount));
            if (index < itemCount)
            {
                courses[index].NumColumns = (int) columnCount;
                list.Add(courses[index]);
            }
            else 
            {
                list.Add(new CompanyCourseViewModel()
                {
                    Id = -Math.Abs(i - courses.Count()),
                    Title = "----",
                    NumColumns = (int)columnCount
                });
            }
        }

        return list;
    } 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top