Je dois construire un tableau HTML qui montre les données pour les utilisateurs par rapport aux pages visitées. Il semble klunky à utiliser pour et/ou foreach boucles, mais je ne peux pas penser à quelque chose de mieux. J'utilise PHP, mais je suppose que c'est un langage agnostique.Les boucles sont-elles le meilleur moyen de construire une table?
Répondre
éviter des boucles est probablement pas possible, sinon la mise en œuvre, il se produira encore au niveau de la machine.
Cependant, si vous voulez essayer de rester « pur » sans le code méchant, vous pouvez au moins faire:
$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
$rowformat = '<tr>%s</tr>';
$cellformat = '<td>%s</td>';
$hdata = '';
foreach($data[0] as $cellname => $cellvalue)
{
$hdata .= sprintf($cellformat, $cellname);
}
$hdata = sprintf($rowformat, $hdata);
$rdata = "";
foreach($data as $rownum => $rowvalue)
{
$row = "";
foreach($rowvalue as $colname => $colvalue)
{
$row .= sprintf($cellformat, $colvalue);
}
$rdata .= sprintf($rowformat,$row);
}
return sprintf($tableformat, $hdata, $rdata);
Au moins de cette façon, il pourrait être un peu maintenable. et vous ne vous inquiétez pas des chaînes incomplètes.
Vous pouvez également subsitutue une partie de ce code avec
$hdata = "<tr><td>" . implode("</td><td>", array_keys($data[0])) . "</td></tr>";
$rdata .= "<tr><td>" . implode("</td><td>", $rowvalue) . "</td></tr>";
qui, tout en étant assez concise, sera peut-être vous mettre dans un peu d'eau chaude par la suite et il aura besoin recodage. (et implode en interne exécute une boucle, donc c'est un perdre-perdre).
Si cela ne vous dérange pas la tête sur des appels de fonctions supplémentaires (et encore des boucles en cours d'exécution), cela pourrait faire pour le code plus concis, sans trop de points négatifs:
$tableformat = '<table><thead>%s</thead><tbody>%s</tbody></table>';
$rowformat = '<tr>%s</tr>';
$cellformat = '<td>%s</td>';
function tr($cells)
{
$o = "";
foreach($cells as $i => $v)
{
$o .= sprintf($cellformat, $v);
}
return sprintf($rowformat, $o);
}
return sprintf($tableformat,
tr(array_keys($data[0])),
implode("", array_map('tr', $data)));
Mais attention, thats difficile à lire, et vous gardez cela un jour, vous vous réveillerez avec un zézaiement.
Eh bien, si vous avez plusieurs lignes, avec des données formatées de façon similaire dans chaque ligne, je ne peux pas penser à un moyen de créer une table qui évite d'utiliser une boucle. Ce genre de chose est essentiellement ce pour quoi les boucles ont été inventées.
Si vous nous avez donné plus de détails sur la table que vous voulez construire, peut-être que nous pouvons formuler une meilleure méthode.
Si vous n'utilisez pas une sorte de boucle alors vous devrez câbler le nombre de lignes et de colonnes dans votre code, ce qui est probablement une idée
bien pire Si les données de la table est dynamique alors vous devez utiliser une boucle. Même si vous obtenez un composant qui génère la table pour vous, il utilisera une boucle en interne.
Cela dépend de votre définition de «meilleur». Les boucles FOR feront bien l'affaire. Je ne suis pas un programmeur PHP, mais en .NET, vous pouvez utiliser le Répéteur, une sorte de modèle que vous pouvez utiliser pour déclarer la table HTML. Il a des modèles pour l'en-tête, le pied de page et chaque élément. Vous liez une source de données au répéteur, et il générera la table HTML pour vous un peu plus élégamment que d'utiliser des boucles FOR. J'imagine qu'il pourrait y avoir une sorte d'équivalent templating en PHP.
En fin de compte, cependant, même le répéteur utilise une sorte de boucle ...
Je recommande fortement le moteur de template Smarty pour PHP. Cela vous permettra de déplacer votre table (et la boucle associée, qui est inévitable) dans le modèle en utilisant la syntaxe Smarty, afin qu'elle soit plus claire et plus séparée de votre logique métier. Vous pourriez remplacer presque tout le code de votre exemple par quelques balises simples dans un extrait de code HTML. Découvrez le cours intensif sur la page Smarty pour un exemple d'utilisation d'une table.
J'utilise généralement des boucles et implode
pour cela, en PHP. Dans un langage qui supporte la programmation fonctionnelle, je le ferais différemment.
function render_table($data) {
$html = '<table>';
$tr = array();
foreach (array_keys($data[0]) as $key) {
$tr[] = '<th>' . htmlspecialchars($key) . '</th>';
}
$html .= "\n" . '<thead>' . "\n" . '<tr>' . "\n" . implode("\n", $tr) . '</tr>' . '</thead>';
$tbody = array();
foreach ($data as $row) {
$tr = array();
foreach ($row as $value) {
$tr[] = '<td>' . htmlspecialchars($value) . '</td>';
}
$tbody[] = '<tr>' . "\n" . implode("\n", $tr) . '</tr>';
}
$html .= "\n" . '<tbody>' . "\n" . implode("\n", $tbody) . '</tbody>';
$html .= '</table>';
return $html;
}
Pourquoi voulez-vous éviter les boucles? Si vous avez un ensemble d'éléments et que vous souhaitez afficher chaque élément, il est évident que la boucle est la solution évidente.
Si vous essayez de séparer le modèle de la vue ou d'écrire un code plus lisible, c'est bien; mais les boucles ne sont pas intrinsèquement mauvaises.
Non, ils ne sont pas mauvais. Mais quand vous avez un énorme ensemble de données et que vous faites des choses bizarres, les boucles n'aident pas à rendre le code lisible. –
- 1. Meilleur moyen de rechercher
- 2. Le meilleur moyen de modifier les enregistrements personnalisés dans ASP.NET?
- 3. Le meilleur moyen de lister les dépendances Merb :: Slices?
- 4. Quel est le meilleur moyen de copier une liste?
- 5. Quel est le meilleur moyen de modéliser les relations parent-enfant stockées dans une table de jointure dans LinqToSql?
- 6. Le meilleur moyen de version une application rails?
- 7. Le meilleur moyen de lire/définir les options IE?
- 8. Meilleur moyen de commencer le développement Mac
- 9. meilleur moyen de découvrir les noeuds sur le réseau local
- 10. Quel est le meilleur moyen de réduire les lignes d'un SELECT en une chaîne?
- 11. Le meilleur moyen de multi-thread?
- 12. Construire une table avec CheckBox avec le moteur PHP Templating
- 13. La différence entre les boucles
- 14. Le meilleur moyen d'organiser cette structure?
- 15. Quel est le meilleur moyen d'insérer et de mettre à jour une table à une ligne dans MySQL?
- 16. tsql: meilleur moyen de mettre à jour une table db avec un fichier csv
- 17. Débutant, tandis que les boucles
- 18. Quel est le meilleur système de construction pour construire une base de données?
- 19. Quel est le meilleur moyen de poster une date/heure dans une vue django?
- 20. Continuer dans les boucles imbriquées
- 21. Existe-t-il un meilleur moyen de structurer une table SQL traitant des questionnaires d'utilisateur?
- 22. mysql-php interrogeant une liste pour construire une table
- 23. Le meilleur moyen de supprimer les répétitions dans une collection en Java?
- 24. Quel est le meilleur moyen de conserver les données dans une application Java Desktop?
- 25. ce qui est le meilleur moyen d'obtenir la table Nombre d'enregistrements avec condition sur SQL Server
- 26. Quel serait le meilleur moyen de fournir une petite sélection d'image dans une application iPhone?
- 27. LINQ to SQL est le meilleur moyen de construire un modèle ou de créer mes propres classes
- 28. Meilleur moyen d'extraire le numéro de téléphone et de reformater?
- 29. Comment le compilateur résout-il les boucles de référence infinies?
- 30. Quel est le meilleur moyen de gérer QUERY_STRING en PHP?
J'aime vraiment ça. Il fait pour le code beaucoup plus propre que les boucles avec des chaînes aléatoires en eux. –
qui mange HTML dans le code PHP, ce qui est (IMNSHO) encore pire que le code mangling au sein de HTML. – Javier
PHP est tronqué comme il est - vous ne pouvez pas faire beaucoup pire, IMO. –