page 116 du Guide du développeur dit "Contrairement à la balise CFLOOOOP, les boucles forestières CFScript ne fournissent pas de support intégrée à la boucle sur les requêtes et les listes."
Q: Comment puis-je boucler sur une liste à l'aide de la nouvelle syntaxe de script à ColdFusion 9? P >
<cfloop list="#qry.Columnlist#" index="FieldName"> <cfset form[FieldName] = qry[FieldName][1]> </cfloop>
3 Réponses :
<cfscript> var i = 0; var Fields = ListToArray(qry.Columnlist); var FieldName = ""; var l = arrayLen(Fields); for (i = 1; i lte l; i = i + 1) // you also can use i++ instead { FieldName = Fields[i]; form[FieldName] = qry[FieldName][1]; } </cfscript>
Forme légèrement plus courte: pour (i = 1; i <= qrecordcount; i ++) {}
@SegiII: C'est tout le point - il ne s'agit pas de l'enregistrement code>, mais de la longueur de la liste de colonne code> code>. ;-)
Je vais d'abord tourner la liste en une matrice. LISTGETTAT () CODE> n'est pas efficace pour être appelé n fois dans une boucle.
ArrayLen () Code> Cependant, devrait être assez rapide.
<cfscript>
arr = ListToArray(qry.Columnlist);
for (i = 1; i <= ArrayLen(arr); i++)
{
fieldName = arr[i];
form[FieldName] = qry[FieldName][1];
}
</cfscript>
Ne serait-il pas aussi plus rapide d'appeler Arraylen une seule fois et de la stocker dans une variable?
oui ça le ferait. Voulez-vous simplement garder le segment de code petit et soigné
Cela a du sens ... et il est plus lisible en utilisant nom de terrain code> que
arr [i] code>.
J'utiliserais probablement un pour (élément in matry) code> boucle ici, Henry. Vous n'avez besoin que de la valeur d'index ici pour obtenir l'élément, vous pourriez aussi bien ne pas vous embêter avec elle.
@AdamCameron ... il a été répondu en 2010 et je doute que la boucle pour le tableau était mature ou même existante. :)
Coldfusion 9? Bien sûr qu'ils l'ont fait. Et je ne l'aurais pas suggéré si ce n'était pas une suggestion appropriée.
@Adamcameron Voir Daveburns Commenter avec 3 votants sur l'autre réponse.
Vous pouvez également essayer le ListToArray, puis utiliser la construction intégrée pour les tableaux en CF9 comme suit:
<cfscript> aCol = listToArray (qry.ColumnList); for( fieldName in aCol ){ form[fieldName] = qry[fieldName][1]; } </cfscript>
Notez que cela fonctionne, mais uniquement avec la mise à jour 1 installée. L'original CF9 donnera une erreur car l'intestinité n'a été autorisée que sur les structures.
Est la variable intermédiaire acol code> nécessaire dans cet exemple?
POUR (Nom de terrain dans ListToarray (QRY.Columnlist)) CODE> Soyez plus propre (moins de pollution de la portée)?
Créera-t-il une variable de matrice supplémentaire, qui implique une allocation de mémoire supplémentaire? Cela signifie-t-il que la balise CFLOOP est plus efficace que de faire des choses telles que cfscript? Je pose cela parce que je veux persuader l'équipe d'utiliser cfscript, mais ils donnent ce point comme un désavantage.
Adam Cameron a mis en place une ressource fantastique à github.com/daccfml/cfscript/blob /master/cfscript.md