We help IT Professionals succeed at work.

Coldfusion Create  the Structure of Arrays with a Distinct suggestions Words

Dan Schimo
Dan Schimo used Ask the Experts™
on
Hello Experts!

During one of my request for help , I have asked for a logic to convert an xml to Struct of arrays and it was very helpful ...

Related Question

Now we need an update the logic to contain ONLY DISTINCT values in the ARRAY
Please help ...


<suggestions elapsed-time="PT0.010333S">
<term original="dissorder">
<suggestion levenschtein-dist="1">Disorder</suggestion>
<suggestion levenschtein-dist="1">disorder</suggestion>
<suggestion levenschtein-dist="2">Disorders</suggestion>
<suggestion levenschtein-dist="2">disorders</suggestion>
<suggestion levenschtein-dist="2">distorter</suggestion>
</term>
<term original="sleep">
<suggestion levenschtein-dist="0">Sleep</suggestion>
<suggestion levenschtein-dist="0">sleep</suggestion>
<suggestion levenschtein-dist="1">asleep</suggestion>
<suggestion levenschtein-dist="1">seep</suggestion>
<suggestion levenschtein-dist="1">sleeps</suggestion>
</term>
</suggestions>

<cfset terms = xmlSearch(xmlfile, "/suggestions/term")>					
				
					<cfset results  = structNew()>
          <cfloop array="#terms#" index="term">
            <cfset zeroLev = xmlSearch(term, "*[@levenschtein-dist='0']")>
            <cfif ArrayLen(zeroLev) EQ 0 >
                <cfset key = term.XmlAttributes.original >
                <cfset results[key] = []>
                <cfloop array="#term.xmlChildren#" index="child">
                      <cfset arrayAppend(results[key], child.xmlText)>
                </cfloop>
            </cfif>
          </cfloop>

Open in new window

Create-Struct-array-from-XML.jpg
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Most Valuable Expert 2015

Commented:
CF8 or CF9? Also is it important to maintain the order of the array?
Dan SchimoAnalyst

Author

Commented:
Cf8
Dan SchimoAnalyst

Author

Commented:
Cf8 , yes order of the array is important as I am assigning the 1st word in the array as an suggestion
Most Valuable Expert 2015
Commented:
CF has arrayFind.  But in CF8 you have to do it the long way.

Since order is important, use list functions and convert the list back to an array at the end.  

       ....
       <cfif ArrayLen(zeroLev) EQ 0 >
                <cfset key = term.XmlAttributes.original >
               <cfset distinctWords = "">
               <cfloop array="#term.xmlChildren#" index="child">
                   <!--- chr(7) / bell . this should not appear anywhere in the data --->
                 <cfif not listFindNoCase(distinctWords, child.xmlText, chr(7))>
                   <cfset distinctWords = listAppend(distinctWords, child.xmlText, chr(7))>
                  </cfif>
              </cfloop>
              <cfset results[key] = listToArray(distinctWords, chr(7))>
        </cfif>
       .... rest of code

Most Valuable Expert 2015

Commented:
> CF has arrayFind.    But in CF8 you have to do it the long way.

Correction:  CF9 has arrayFind ...
Dan SchimoAnalyst

Author

Commented:
Works Like a Charm as usual , Could you please shed some light on the chr(7) used in the Code . If you have got some Time....

--Thanks
-Dan.S
Most Valuable Expert 2015

Commented:
Sure.  With list functions you must pick a delimiter that doesn't appear within the data or you get the wrong results. chr(7) is the non-printable bell character. It's very unlikely it'll appear in your data.  So it makes a pretty safe delimiter.