Whatever message this page gives is out now! Go check it out!
ListFindLast(String list, String value [, String delimiter [, boolean includeEmptyFields]])list.listFindLast(String value [, String delimiter [, boolean includeEmptyFields]])| Parameter | Type | Description |
|---|---|---|
| list | String (required) | The delimited list to search. |
| value | String (required) | The value to search for. The comparison is case-sensitive. |
| delimiter | String | Default: ",". One or more delimiter characters. Each character in the string acts as a separate delimiter. |
| includeEmptyFields | boolean | Default: false. If true, empty elements between consecutive delimiters are counted as list positions. If false, consecutive delimiters are treated as a single delimiter. |
0 if not found.
<cfscript>
simpleList = "red,blue,green,red,yellow,blue";
lastRed = ListFindLast(simpleList, "red");
writeOutput("Last 'red' at position: " & lastRed);
// Output: Last 'red' at position: 4
</cfscript>
<cfscript>
list1 = "first,second,first,third,first";
firstResult = list1.listFind("first");
lastResult = list1.listFindLast("first");
writeOutput("ListFind: " & firstResult & ", ListFindLast: " & lastResult);
// Output: ListFind: 1, ListFindLast: 5
</cfscript>
<cfscript>
customList = "item1;item2;item1;item3;item2";
lastItem1 = ListFindLast(customList, "item1", ";");
writeOutput("Last 'item1' at position: " & lastItem1);
// Output: Last 'item1' at position: 3
</cfscript>
<cfscript>
list1 = "one.two,three;one|four";
result = list1.listFindLast("one", ".,;|");
writeOutput("Multiple delimiters: " & result);
// Output: Multiple delimiters: 4
</cfscript>
<cfscript>
listWithEmpty = "first,,third,,fifth";
// With includeEmptyFields=true — empty elements count as positions
lastEmpty = ListFindLast(listWithEmpty, "", ",", true);
writeOutput("Last empty field (includeEmpty=true): " & lastEmpty);
// Output: Last empty field (includeEmpty=true): 4
// With includeEmptyFields=false — empty elements are ignored
result = ListFindLast(listWithEmpty, "", ",", false);
writeOutput("Last empty field (includeEmpty=false): " & result);
// Output: Last empty field (includeEmpty=false): 0
</cfscript>
<cfscript>
list1 = "Apple,apple,APPLE,Apple";
writeOutput("Last 'Apple': " & list1.listFindLast("Apple")); // 4
writeOutput("Last 'apple': " & list1.listFindLast("apple")); // 2
writeOutput("Last 'APPLE': " & list1.listFindLast("APPLE")); // 3
writeOutput("Last 'aPPle': " & list1.listFindLast("aPPle")); // 0 (not found)
</cfscript>
<cfscript>
list1 = "apple,banana,apple,cherry,apple";
// 1-arg member function
result1 = list1.listFindLast("apple");
writeOutput("list.listFindLast(value): " & result1);
// Output: 5
// 2-arg member function with delimiter
list2 = "alpha;beta;alpha;gamma";
result2 = list2.listFindLast("alpha", ";");
writeOutput("list.listFindLast(value, delim): " & result2);
// Output: 3
</cfscript>
<cfscript>
myList = "apple,banana,apple,cherry,apple";
// Standard order
r1 = ListFindLast(list=myList, value="apple");
writeOutput("list=, value=: " & r1); // 5
// Reversed order
r2 = ListFindLast(value="banana", list=myList);
writeOutput("value=, list=: " & r2); // 2
// 4-arg named, reordered
listWithEmpty = "p,,q,,p";
r3 = ListFindLast(includeEmptyFields=true, list=listWithEmpty, value="p", delimiter=",");
writeOutput("4-arg reordered: " & r3); // 5
</cfscript>
<cfscript>
list1 = "apple,banana,cherry";
result = list1.listFindLast("orange");
writeOutput("Non-existent 'orange': " & result);
// Output: Non-existent 'orange': 0
</cfscript>
<cfscript>
list1 = "";
result = ListFindLast(list1, "anything");
writeOutput("Empty list: " & result);
// Output: Empty list: 0
</cfscript>
<cfscript>
list1 = "old,new,old,newer,old";
lastOldPos = list1.listFindLast("old");
if (lastOldPos > 0) {
newList = ListSetAt(list1, lastOldPos, "newest");
}
writeOutput("Original: " & list1);
writeOutput("Modified: " & newList);
// Output:
// Original: old,new,old,newer,old
// Modified: old,new,old,newer,newest
</cfscript>
<cfscript>
largeList = "";
for (i = 1; i <= 1000; i++) {
if (i > 1) largeList = largeList & ",";
largeList = largeList & "item" & i;
}
largeList = largeList & ",target";
result = ListFindLast(largeList, "target");
writeOutput("Target at position: " & result);
// Output: Target at position: 1001
</cfscript>
<cfscript>
function findLastInList(required string list, required string value, string delimiter = ",") {
return ListFindLast(list, value, delimiter);
}
list1 = "apple,banana,apple,cherry,apple";
result = findLastInList(list1, "apple");
writeOutput("UDF result: " & result);
// Output: UDF result: 5
</cfscript>
<cfscript>
findLastClosure = function(list, value) {
return list.listFindLast(value);
};
list1 = "one,two,one,three,one";
result = findLastClosure(list1, "one");
writeOutput("Closure result: " & result);
// Output: Closure result: 5
</cfscript>delimiter is treated as an independent delimiter.includeEmptyFields=true when empty list items must be counted as valid positions.