2013-09-09 4 views
0

У меня есть массив, который имеет структуру ImageID и Custnum. Мне нужно найти определенный ImageID и получить Custnum для него. Я использую ColdFusion 8, у которого нет команды ArrayFind. Как бы это сделать, не зацикливая каждый элемент? Благодарю.ColdFusion 8 ArrayFind Substitute

ответ

0

На ваш вопрос можно ответить на вопрос «Is there a function similar to ArrayFind from ColdFusion 9 in ColdFusion 8?», но я не вижу другого способа, кроме цикла.

Вы всегда можете создать и использовать UDF, но ему придется использовать цикл.

Почему вы все равно не хотите использовать петлю? У вас есть много элементов в массиве? Не забудьте использовать cfbreak после того, как вы обнаружите, что ваш элемент перестает проходить через остальную часть массива.

0

Учитывая вашу ситуацию, я не думаю, что arrayFind() поможет вам в любом случае, чтобы найти что-то с arrayFind(), вам нужно точно знать, что вы ищете. И хотя вы знаете свой ImageID, вы не знаете связанного с ним связанного с ним Custnum (отсюда и ваша основная проблема).

В CF нет ничего уродищевого, который мог бы помочь вам здесь, но есть 0D CFLib - structFindKeyWithValue(), который сделает трюк.

Это написано для CF9, но оно легко передается в CF8. Модифицированный, CF8 дружественный вариант - это в примере ниже:

<cfscript> 
a = [ 
    {ImageID=1, Custnum=1}, 
    {ImageID=2, Custnum=2}, 
    {ImageID=3, Custnum=3}, 
    {ImageID=4, Custnum=4} 
]; 
testStruct = {a=a}; 
result = structFindKeyWithValue(testStruct, "ImageID", 2, "ONE"); 

function structFindKeyWithValue(struct, key, value, scope){ 
    var keyResult = false; 
    var valueResult = []; 
    var i = 0; 

    if (!isValid("regex", arguments.scope, "(?i)one|all")){ 
     throw(type="InvalidArgumentException", message="Search scope #arguments.scope# must be ""one"" or ""all""."); 
    } 
    keyResult = structFindKey(struct, key, "all"); 
    for (i=1; i <= arrayLen(keyResult); i++){ 
     if (keyResult[i].value == value){ 
      arrayAppend(valueResult, keyResult[i]); 
      if (scope == "one"){ 
       break; 
      } 
     } 
    } 
    return valueResult; 
} 
</cfscript> 
<cfdump var="#result#"> 

Обратите внимание, что, потому что это stuct функции, вам нужно обернуть ваши данные в структурах первым. Кроме этого, это довольно просто.

+0

Спасибо, это полезно! Как тогда я буду использовать этот скрипт для массива в массиве. http://www.artphotoindex.com/api/exhibitions-new/utilities/test-array.cfm – user2654985

+0

Ничего другого. structFindKey()/~ Value() будет пересекать столько уровней массива, сколько необходимо для поиска проверяемых структур. –

+0

Хм. Я попробовал это без каких-либо результатов. Не могли бы вы проверить ссылку, чтобы увидеть, что я могу делать неправильно? http://artphotoindex.com/api/exhibitions-new/utilities/test-array.cfm – user2654985