Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Array Question

Guest
May 19, 2009 May 19, 2009

Hello,

Can someone figure this out? When i try to search for "27" it doesn't work, but if i try to search for "15" it seems to work. I'm breaking my head for hours trying to figure out why this isn't working.

What i'm trying to accomplish is if i do a search for "27" it takes that position in the array, then grabs that same position in the second array "arrayt[2][4]" and gives me the value, i know its possible to do something like this in perl with hashes but not sure how i can do this in coldfusion. I'm not sure if there is a better way to do this, but this is the only way i could figure out.


<cfset arrayt = ArrayNew(2)>

<cfset arrayt[1][1] = "15">
<cfset arrayt[1][2] = "19">
<cfset arrayt[1][3] = "01">
<cfset arrayt[1][4] = "27">

<cfset arrayt[2][1] = "111">
<cfset arrayt[2][2] = "112">
<cfset arrayt[2][3] = "113">
<cfset arrayt[2][4] = "114">

<cfset amount = ArrayLen(arrayt)>

<!---
Search a multidimensional array for a value.

@Param arrayToSearch      Array to search. (Required)
@Param valueToFind      Value to find. (Required)
@Param dimensionToSearch      Dimension to search. (Required)
@Return Returns a number.
@author Grant Szabo (grant@quagmire.com)
@version 1, September 23, 2004
--->
<cffunction name="ArrayFindByDimension" access="public" returntype="numeric" output="false">
    <cfargument name="arrayToSearch" type="array" required="Yes">
    <cfargument name="valueToFind" type="string" required="Yes">
    <cfargument name="dimensionToSearch" type="numeric" required="Yes">
    <cfscript>
        var ii = 1;
       
        //loop through the array, looking for the value
        for(; ii LTE arrayLen(arguments.arrayToSearch); ii = ii + 1){
            //if this is the value, return the index
            if(NOT compareNoCase(arguments.arrayToSearch[ii][arguments.dimensionToSearch], arguments.valueToFind))
                return ii;
        }
        //if we've gotten this far, it means the value was not found, so return 0
        return 0;
    </cfscript>
</cffunction>

<cfoutput>
#ArrayLen(arrayt[1])#
<cfscript>
writeOutput(arrayFindByDimension(arrayt,"27",1) & "<br>");           
</cfscript>
</cfoutput>

838
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Beginner , May 20, 2009 May 20, 2009

Your code needs the following changes.

Your Code :   for(; ii LTE arrayLen(arguments.arrayToSearch); ii = ii + 1){

Changed Code :  for(; ii LTE arrayLen(arguments.arrayToSearch[arguments.dimensionToSearch]); ii = ii + 1){

Comment : arrayLen gives only diemention. So you have to use arraydimention along with array to get total number of elements of an array dimention.

Your Code :    if(NOT compareNoCase(arguments.arrayToSearch[ii][arguments.dimensionToSearch], arguments.valueToFind))       

Changed C

...
Translate
Valorous Hero ,
May 19, 2009 May 19, 2009

Your function call "arrayFindByDimension(arrayt,"27",1)" combined with the "dimensionToSearch" property of your function means that this logic will only search the first element of the second deminsion of all the elements in the first dimension of your array.  I.E. the only values that could be matched would be arrayt[1][1] with a value of "15" and arrayt[2][1] with a value of "111".

I think what you want to do is loop over all the second diminsion elements of the first element in the first dimension.  So your comparison would be something like compareNoCase(arguments.arrayToSearch[arguments.dimensionToSearch][ii], arguments.valueToFind),  This might require a close look at your looping logic to make sure you are looping over the correct diminsion.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 20, 2009 May 20, 2009

Your code needs the following changes.

Your Code :   for(; ii LTE arrayLen(arguments.arrayToSearch); ii = ii + 1){

Changed Code :  for(; ii LTE arrayLen(arguments.arrayToSearch[arguments.dimensionToSearch]); ii = ii + 1){

Comment : arrayLen gives only diemention. So you have to use arraydimention along with array to get total number of elements of an array dimention.

Your Code :    if(NOT compareNoCase(arguments.arrayToSearch[ii][arguments.dimensionToSearch], arguments.valueToFind))       

Changed Code :   if(NOT compareNoCase(arguments.arrayToSearch[arguments.dimensionToSearch][ii], arguments.valueToFind))

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guest
May 20, 2009 May 20, 2009

Wow Uddaraju Ramesh thank you very much for your response, that was exactly what i was looking for, it worked liked a champ.

I just have one more question, Lets say i had the following array

<cfset arrayt = ArrayNew(2)>

<cfset arrayt[1][1] = "15">
<cfset arrayt[1][2] = "19">
<cfset arrayt[1][3] = "1">
<cfset arrayt[1][4] = "27">
<cfset arrayt[1][5] = "1">
<cfset arrayt[1][6] = "22">
<cfset arrayt[1][7] = "27">

<cfset arrayt[2][1] = "111">
<cfset arrayt[2][2] = "112">
<cfset arrayt[2][3] = "113">
<cfset arrayt[2][4] = "114">
<cfset arrayt[2][5] = "115">
<cfset arrayt[2][6] = "116">
<cfset arrayt[2][7] = "117">

<cfoutput>
#ArrayLen(arrayt[1])#
<cfscript>
writeOutput(arrayFindByDimension(arrayt,"27",1) & "<br>");           
</cfscript>
</cfoutput>

Now since there are 2 of the same values, how would i be able to grab both instances? Or is that even possible?

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
May 27, 2009 May 27, 2009
LATEST

See the following code for your question. As we have to return all occurences of a particular value ( in your case that is 27 ) in the list
I modified the code to return the locations as a list.

<cfset arrayt = ArrayNew(2)>


<cfset arrayt[1][1] = "15">
<cfset arrayt[1][2] = "19">
<cfset arrayt[1][3] = "1">
<cfset arrayt[1][4] = "27">
<cfset arrayt[1][5] = "1">
<cfset arrayt[1][6] = "22">
<cfset arrayt[1][7] = "27">
 
<cfset arrayt[2][1] = "111">
<cfset arrayt[2][2] = "112">
<cfset arrayt[2][3] = "113">
<cfset arrayt[2][4] = "114">
<cfset arrayt[2][5] = "115">
<cfset arrayt[2][6] = "116">
<cfset arrayt[2][7] = "117">
 

<cfset amount = ArrayLen(arrayt)>


<cffunction name="ArrayFindByDimension" access="public"  output="false">
     <cfargument name="arrayToSearch" type="array" required="Yes">
     <cfargument name="valueToFind" type="string" required="Yes">
     <cfargument name="dimensionToSearch" type="numeric" required="Yes">
     <cfset lst = "">
     <cfset ii = 1>
     <cfscript>
              
         //loop through the array, looking for the value
         for(; ii LTE arrayLen(arguments.arrayToSearch[arguments.dimensionToSearch]); ii = ii + 1){
             //if this is the value, return the index
             if(NOT compareNoCase(arguments.arrayToSearch[arguments.dimensionToSearch][ii], arguments.valueToFind))
                 lst = lst & ii & ",";
         }
         //if we've gotten this far, it means the value was not found, so return 0
         return lst;
     </cfscript>
</cffunction>

<cfoutput>
<!---#ArrayLen(arrayt[1])#--->
Found the given number in the following locations.<br>
<cfscript>
writeOutput(arrayFindByDimension(arrayt,"27",1) & "<br>");          
</cfscript>
</cfoutput>

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Engaged ,
May 20, 2009 May 20, 2009

ColdFusion isn't Perl, but its structs are, effectively, "a hash."  Therefore, it seems to me that instead of "looking for," say, "27," you should use a hash struct to determine if the value is there.  Obviously, you can do both:  the data value in the hash struct could be the [X,Y] dimension in the array where that particular value can be found.

AFAIK, structs can be multi-dimensional so that (Holy REXX, Batman!) you could find yourself querying, say, mystructure.27.X and mystructure.27.Y...

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Resources