PDA

نسخه کامل مشاهده نسخه کامل : آموزش کلد فیوژن: انواع داده پیچیده : لیست ها



javadshahvand
05-10-2007, 20:06
لیست ها در حقیقت رشته هایی هستند که مقادیر در آن به وسیله ی یک کاراکتر خاص از هم جدا شده اند. مانند مثال های زیر :

<cfset List_of_employees="Hadi Moshayedi,Hossein Sharafi,Ben Forta">
<cfset List_of_animals="Elephant;Horse;Monkey">
<cfset List_of_salaries="۱۲۰۰۰,۱۳۰۰,۵۰۰۰,۴۰۰۰">

به کاراکتری که مقادیر را از هم جدا می کند، Delimiter گویند. مثلا , (کاما) در مثال اول و ; در مثال دوم.
همانطور که در مثال های بالا دیدید، برای ایجاد لیست ها از <cfset ... > استفاده می کنیم و مقادیر اولیه را تنظیم می کنیم.
● افزودن مقادیر به یک لیست :
ساده ترین راه برای افزودن یک مقدار به یک لیست استفاده از تابع ListAppend به صورت زیر می باشد :

<cfset myList="hadi,coldfusion,something">
<cfset myList = ListAppend(myList,"php")>

مثال بالا مقدار جدید "php" را به انتهای لیست اضافه می کند. این تابع، دارای پارامتر سومی می باشد که اختیاری می باشد و می تواند مانند مثال بالا ذکر نشود. این پارامتر سوم، Delimiter لیست را مشخص می کند و به صورت پیش فرض مقدار آن کاما می باشد. اگر در لیست از Delimiter ی به غیر از کاما استفاده کرده باشیم، برای افزودن یک مقدار به انتهای لیست به صورت زیر عمل می کنیم :

<cfset myList="hadi;coldfusion;something">
<cfset myList = ListAppend(myList,"php",";")>

ListAppend مقدار جدید را به انتهای لیست اضافه می کرد. برای افزودن یک مقدار به ابتدای لیست، از تابع ListPrepend ، به همان صورت که از ListAppend استفاده می کردیم، استفاده می کنیم. به مثال های زیر توجه فرمائید :

<cfset myList="a,b,c,d">
<cfset myList = ListPrepend(myList,"۰")>
<!--- Now, myList contains "۰,a,b,c,d" --->
<cfset myList="a;b;c;d">
<cfset myList = ListPrepend(myList,"۰",";")>
<!--- Now, myList contains "۰;a;b;c;d" --->

برای افزودن مقداری به لیست در یک مکان مشخص، از تابع ListInsertAt استفاده می کنیم. به صورت زیر :

<cfset myList="a,b,c,d">
<cfset myList = ListInsertAt(myList,۳,"h")>

در مثال بالا، مقدار "h" سومین عنصر از لیست خواهد شد. مانند توابع دیگری که در این مقاله معرفی گردید، این تابع نیز دارای پارامتر اختیاری چهارمی هست که Delimiter لیست را مشخص می کند و مقدار پیش فرض آن کاما می باشد.
● استخراج مقداری از لیست با استفاده از اندیس آن
برای استخراج مقدار عنصری از لیست با استفاده از اندیس آن، از تابع ListGetAt استفاده می کنیم. به صورت زیر :

<cfset myList="a,b,c,d">
<cfset second_item=ListGetAt(myList,۲)>

کد بالا مقدار عنصر دوم لیست myList را در متغیر second_item قرار می دهد.
این تابع نیز دارای پارامتر اختیاری مشخص کننده Delimiter می باشد.
توابع ListFirst و ListLast به ترتیب مقدار عنصر اول، و مقدار عنصر آخر لیست را می دهند. تابع ListRest تمام عناصر یک لیست به غیر از عنصر اول را به عنوان خروجی می دهد.

<cfset myList="a,b,c,d">
<cfset first_item = ListFirst(myList)>
<!--- first_item contains "a" now --->
<cfset last_item = ListLast(myList)>
<!--- last_item contains "d" now --->
<cfset rest_items = ListRest(myList)>
<!--- rest_items contains "b,c,d" now --->

برای بدست آوردن تعداد عناصر یک لیست از تابع ListLen به صورت زیر استفاده می کنیم :

<cfset myList="a,b,c,d">
<cfset myListLen = ListLen(myList)>
<!---Now, myListLen Equals ۴ --->
<cfset myList="a;b;c;d">
<cfset myListLen = ListLen(myList,";")>
<!---Now, myListLen Equals ۴ --->

برای حذف عنصری از لیست، از تابع ListDeleteAt به صورت زیر استفاده می کنیم :

<cfset myList="a,b,c,d">
<cfset myList = ListDeleteAt(myList,۲)>

کد بالا عنصر دوم لیست را حذف می کند.
●جستجو در لیست ها
برای پیدا کردن مقداری در لیست، از تابع ListFind استفاده می کنیم. این تابع موقعیت اولین عنصری که دارای مقدار دلخواه باشد را به عنوان خروجی بر می گرداند.

<cfset myList="Hadi,Hossein,Ben">
<cfset Pos۱ = ListFind(myList,"Ben")>
<!--- Pos۱ equals ۳ now --->

تابع ListContains موقعیت اولین عنصری که دارای مقدار شامل عبارت مورد نظر را به عنوان خروجی بر می گرداند.

<cfset myList="Hadi,Hossein,Ben">
<cfset Pos۲ = ListContains(myList,"se")>
<!--- Pos۲ equals ۲ now --->

کد بالا مقدار ۲ را در متغیر Pos۲ قرار می دهد، زیرا عبارت Hossein شامل عبارت se می باشد.
ListFind و ListContains بین حروف بزرگ و کوچک تفاوت قائل می شوند. برای اینکه در جستجو حروف بزرگ و کوچک یکسان باشند به جای توابع بالا از توابع ListFindNoCase و ListContainsNoCase استفاده می کنیم.
● لیست های دارای عناصر خالی
عناصر خالی، عناصری از لیست هستند که دارای هیچ مقداری نمی باشند. برای درک چگونگی کار با آن ها به مثال زیر توجه کنید :

<cfset myList = "Hadi,,Hossein,Ben,,">

فکر می کنید لیست myList دارای چند عنصر می باشد؟ شاید فکر کنید که این لیست دارای شش عنصر می باشد، ولی کلدفیوژن عناصر دارای مقدار خالی را حساب نمی کند ... پس لیست بالا از نظر کلدفیوژن سه عنصر دارد و "Ben" مقدار عنصر سوم آن می باشد.
برای ایجاد عناصر خالی، از کاراکتر فاصله به جای مقدار خالی استفاده کنید، مانند مثال زیر :

<cfset myList = "Hadi, ,Hossein,Ben, , ">

لیست بالا از نظر کلدفیوژن شش عنصر دارد.
برای تغییر مقدار عنصری از لیست از تابع ListSetAt مانند مثال زیر استفاده می کنیم :

<cfset myList = "Hadi,Hossein,Ben">
<cfset myList = ListSetAt(myList,۱,"Good Boy")>
<!--- myList = "Good Boy,Hossein,Ben" --->

کد بالا مقدار عنصر اول لیست را از Hadi به Good Boy تغییر می دهد.
● مرتب سازی عناصر لیست
برای مرتب سازی عناصر یک لیست از تابع ListSort استفاده می کنیم. این تابع دارای دو پارامتر اجباری که اولی مشخص کننده لیست، و دومی مشخص کننده نوع مرتب سازی می باشد، می باشد.

<cfset myList = "a,d,c,v">
<cfset myList = ListSort(myList,"text")>

مقادیر قابل قبول برای پارامتر دوم عبارتند از "text"، "textnocase"، و "numeric". مرتب سازی "text" بین حروف بزرگ و کوچک تفاوت قائل می باشد و در مرتب سازی حروف بزرگتر اول تر قرار می گیرند ... "textnocase" برای حروف بزرگ و کوچک ارزش یکسانی قائل می باشد. "numeric" عناصر بر اساس ارزش عددی آن ها مرتب می سازد.
پارانتر سوم که اختیاری می باشد، ترتیب مرتب سازی را مشخص می سازد. "asc" (مقدار پیش فرض) مشخص می کند که مرتب سازی از ارزش کمتر به ارزش بیشتر باشد . "desc" برای مرتب سازی از ارزش بیشتر به ارزش کمتر به کار می رود. به مثال های زیر توجه کنید :

<cfset myList = "a,d,c,v">
<cfset myList = ListSort(myList,"text")>
<!--- myList = "a,c,d,v" --->
<cfset myList = "a,B,c,d">
<cfset myList = ListSort(myList, "textnocase", "desc")>
<!--- myList = "d,c,B,a" --->

● Delimiter های یک لیست
توابعی که برای کار با لیست ها به کار می روند تقریبا همه شان یک پارامتر آخری اختیاری دارند که Delimiter لیست را مشخص می سازد. Delimiter هایی که اکثرا مورد استفاده قرار می گیرند، عبارتند از : کاما، ;، |، ~ .
برای تغییر Delimiter یک لیست از تابع ListChangeDelims به صورت زیر استفاده می کنیم :

*<cfset myList = "a;b;c;d">
<cfset myList = ListChangeDelims(myList, ",", ";")>
<!--- myList = "a,b,c,d" --->

پارامتر دوم مشخص کننده Delimiter جدید و پارامتر سوم مشخص کننده Delimiter قبلی می باشد. پارامتر سوم اختیاری می باشد و دارای مقدار پیش فرض کاما می باشد.
● ایجاد حلقه(Loop) روی عناصر لیست
برای ایجاد حلقه روی عناصر یک لیست، به صورت زیر عمل می کنیم :

<cfset myList = "a;b;c;d">
<cfoutput>
<cfloop list="#myList#" index="theElement" delimiters=";" >
#theElement#<br>
</cfloop>
</cfoutput>

در کد بالا، theElement ابتدا مقدار "a" ، سپس مقدار "b" ، سپس مقدار "c" و در آخر مقدار "d" می گیرد و در هر مرحله کد بین <cfloop ...></cfloop> را برای مقادیر theElement اجرا می کند. delimiters اختیاری می باشد و دارای مقدار پیش فرض کاما می باشد.
● مناسب سازی یک لیست برای عبارات SQL
لیست زیر را در نظر بگیرید :

<cfset myList = "pear,lemon,orange,citron">

و حال می خواهید لیست بالا در Query زیر استفاده کنید :

SELECT *
FROM Fruit
WHERE FruitName IN (&#۰۳۹;pear&#۰۳۹;,&#۰۳۹;lemon&#۰۳۹;,&#۰۳۹;orange&#۰۳۹;,&#۰۳۹;citron&#۰۳۹;)

شما نمی توانید از لیست به این صورت استفاده کنید :

SELECT *
FROM Fruit
WHERE FruitName IN (#myList#)

زیرا عناصر لیست دارای &#۰۳۹; (single quote) در دو طرفشان نمی باشند. برای این منظور، از تابع ListQualify استفاده می کنیم. مانند مثال زیر :

SELECT *
FROM Fruit
WHERE FruitName IN (#ListQualify(myList,"&#۰۳۹;")#))

● موارد استفاده از لیست ها
اینکه کجا از لیست ها استفاده کنید، بستگی به خودتان و خلاقیت و نحوه ی تفکر شما دارد. اما من شخصا از لیست ها در موارد زیر استفاده می کنم :
۱) وقتی می خواهم در یک متغیر کوکی (cookie) بیش از یک مقدار قرار دهم. زیرا نمی توان به کوکی ها مقادیر آرایه ای داد، لیست ها در این جا یکی از انتخاب های خوب برای استفاده می باشد. روش دیگری هم وجود دارد که بعدا در باره ی آن صحبت خواهم کرد.
۲) هنگامی می خواهم لیستی از مقادیر را در یک فیلد از یک رکورد در پایگاه داده ذخیره کنم. در این مورد نیز نمی توان از آرایه ها استفاده کرد.

نویسنده : هادی مشیدی


سایت ماکرومدیاx