1

私はまだColdfusionを理解しようとしています...

ファイルのダイレクトを作成し(たとえば、10個のファイルがある)、5個のランダムファイルを出力する必要があります。ファイルの取得と出力は問題ありませんが、ランドレンジのどこに収まるかわかりません。これが私のコードです:

 <cfdirectory action="list" directory="#expandpath("img/")#" filter="some*.*" name="dir">
     <!--- imgID --->
     <CFSET imgID= #RandRange(1, #dir.allRecords#)#>
     <!--- this only grabs the first 5 files --->
     <cfoutput query="dir" maxrows="5">
        <cfif FileExists("#expandpath("img/#name#")#")>
        <cfimage source="#expandpath("img/#name#")#" name="myImage">                                                   <cfif IsImage(myImage) is true>
          <cfset ImageSetAntialiasing(myImage,"on")>
              <cfset ImageScaleToFit(myImage,"highestQuality")>
              <!--- append to a list --->
          <li><cfimage source="#myImage#" action="writeToBrowser"></li>
           </cfif>               
        </cfif>
      </cfoutput>   

これは、最初の5つの画像を表示する際に問題なく機能します。ただし、ランダムな画像を5つ作成したいと思います。

いくつかの洞察をありがとう!

編集:
これは私がそれをやった方法です-未解決の1つの質問-

<!-- get the directy, listinfo="name" because I only need filenames --->
<cfdirectory action="list" LISTINFO="name" directory="#expandpath(" logos/")#" filter="marke*.*" name="dir">

 <cfset images=[ ]>
 <!-- since dir is not indexable, like dir[pos], I need another array!-->
 <cfset dirArr=[ ]>
 <cfset blocker="false">
 <cfset maxLogos=5>
 <!-- fill new dirArr(ay) -->               
 <cfoutput query="dir">
    <cfset #ArrayAppend(dirArr, #expandpath( "logos/#name#")#)#>
 </cfoutput>
 <!-- loop -->
 <cfloop condition="blocker eq false">
    <-- random position -->
    <cfset pos=R andRange(1, #dir.recordcount#)>
    <cfif #dir.recordcount# eq 0 OR #ArrayLen(images)# gte #maxLogos#>
        <-- STOP loop -->
        <cfset blocker="true">
    </cfif>
    <cfset ArrayAppend(images, #dirArr[pos]#)>
    <!-- BROKEN unknown ARRAYDELETE --> 
    <!--- <cfset ArrayDelete(dirArr, #dirArr[pos]#)> --->
    <!-- IMG -->
    <cfimage source="#dirArr[pos]#" name="myImage">
    <cfif IsImage(myImage) is true>
        <cfoutput>
        <li data-icon="false">
           <cfimage source="#myImage#" action="writeToBrowser">
        </li>
        </cfoutput>
    </cfif>
 </cfloop>

問題は、ArrayDeleteが機能しないことです。変数ARRAYDELETEが未定義であると、Coldfusion(8)が教えてくれます。私が間違っていることについて何か考えはありますか?

4

2 に答える 2

3

簡単な代替方法は、配列を1回シャッフルしてから、最初の5つの項目を取得することです。

<cfset MaxLogos = 5 />
<cfset Images   = [] />
<cfset Files    = DirectoryList( expandPath("logos") , false, "name" , "marke*.jpg" ) />

<cfset createObject( "java", "java.util.Collections" ).shuffle( Files ) />

<cfloop index="i" from="1" to=#Min(MaxLogos,ArrayLen(Files))# >
    <cfset ArrayAppend( Images , Files[i] ) />
</cfloop>

<cfdump var=#Images# />
于 2012-04-23T17:24:51.013 に答える
1

コードにいくつかの構文エラーがあるように見えるため、コードが実際に機能するかどうかはわかりません。また、 imgでディレクトリリストを作成していますが、ロゴから画像を取得していて、これらのディレクトリ間の関係が明確になっていない場合もあります。

これらの問題はさておき、これが私がこれをどのように処理するかです。

<cfscript>
// this code is untested, but should get you going
// get list of image file names as an array
dir = directoryList(expandPath("imgs"), false, "name", "*.jpg");
images = [];
while(true) {
  // if out directory list is now empty or we have 5 results, we're done
  if(!arrayLen(dir) or arrayLen(images) gte 5) break;
  // get an image from a random point in the list
  pos = randrange(1, arrayLen(dir));
  // append it to our images array
  arrayAppend(images, dir[pos]);
  // delete form the source array, this avoids duplicates in further iterations
  arrayDeleteAt(dir, pos);
}
</cfscript>

これにより、0〜5個の要素を持つ画像の配列が得られ、リストとして出力できます。

ちなみに、<cfimage>と関連関数を繰り返し使用することはお勧めできません。画像のサイズを変更したり操作したりする必要がある場合は、リクエストごとに操作を繰り返すのではなく、画像をディスクにキャッシュして戻す必要があります。

于 2012-04-23T08:59:58.080 に答える