Welcome!

You will be redirected in 30 seconds or close now.

ColdFusion Authors: Yakov Fain, Jeremy Geelan, Maureen O'Gara, Nancy Y. Nee, Tad Anderson

Related Topics: ColdFusion

ColdFusion: Article

All About Arrays: Part 2

All About Arrays: Part 2

In the last issue of CFDJ (December 2002), we looked at arrays, those enormously useful creatures that are underused by some developers. We confined ourselves to one-dimensional arrays - those arrays that look like a single row from a spreadsheet.

When Data Won't Fit into a One-Dimensional Array
But, of course, all data doesn't fit neatly into a single row. Consider, for instance, the case in which we want to keep track of five students who have each taken four tests. We might create a spreadsheet like this to keep track of their test scores:

How, though, do we get that into an array? We can fit those scores into an array only if we can expand our definition of array to mean something more than a single row of values. Luckily we can. We have just such a definition when we explore multidimensional arrays in ColdFusion.

Arrays of Arrays
You can best think of a multidimensional array as an "array of arrays." In the test scores example above, changing the image a bit can be helpful in understanding this concept. For the sake of clarity, I omit the descriptive information that isn't part of the array itself:

Now we have a series of one-dimensional arrays stacked on top of one another. That idea, as we'll see, is key to understanding how to use ColdFusion array functions with multidimensional arrays. But first, let's create this array.

Creating a Two-Dimensional Array
If we only had the first "row" to deal with (the test scores for the first test), creating the array would be easy:

<cfscript>
onedee = ArrayNew(1);
onedee[1] = 93;
onedee[2] = 82;
onedee[3] = 99;
onedee[4] = 100;
onedee[5] = 74;
</cfscript>

Each number in square brackets (the index) is the number of an associated column. To work with arrays in two dimensions (width and height), we need to use two indices to point at a specific array element. The first index will indicate the row number and the second will indicate its column number. The code for writing the "array of arrays" to keep track of all test scores is just a matter of keeping the row and column numbers straight.

<cfscript>
twodee = ArrayNew(2);

twodee[1][1] = 93;
twodee[1][2] = 87;
twodee[1][3] = 99;
twodee[1][4] = 100;
twodee[1][5] = 74;

twodee[2][1] = 89;
twodee[2][2] = 78;
twodee[2][3] = 100;
twodee[2][4] = 82;
twodee[2][5] = 82;

twodee[3][1] = 94;
twodee[3][2] = 84;
twodee[3][3] = 92;
twodee[3][4] = 96;
twodee[3][5] = 84;

twodee[4][1] = 88;
twodee[4][2] = 81;
twodee[4][3] = 100;
twodee[4][4] = 94;
twodee[4][5] = 83;
</cfscript>

Accessing Two-Dimensional Array Elements
How did Carla (who's represented by the third column) do on her second test (represented by the second row)? Let's find out:

<cfoutput>
Carla got a #twodee[2][3]# on her second test.
</cfoutput>

...and that snippet produces this:
Carla got a 100 on her second test.
How did Ellen do on her first test?

<cfoutput>
Ellen got a #twodee[1][5]# on her first test.
</cfoutput>

...which produces: Ellen got a 74 on her first test. Whoops, I guess we shouldn't have asked.

Looping over Two-Dimensional Arrays
Looping over one of these "stacked-up" arrays requires us to use two loops, one nested within the other. Start by looping over the rows and then within this loop, loop over the columns for each row. Here's the code:

<cfoutput>
<cfloop
from="1"
to="#ArrayLen(twodee)#"
index="rowNumber">
<cfloop
from="1"
to="#ArrayLen(twodee[rowNumber])#"
index="columnNumber">
#twodee[rowNumber][columnNumber]#
</cfloop><br>
</cfloop>
</cfoutput>

That code will produce this screen (see Figure 4):

If you'd like it to look a bit more like a spreadsheet, you can adapt the code so that it places the information in a table:

<table border="thin" bordercolor="silver">
<cfoutput>
<cfloop
from="1"
to="#ArrayLen(twodee)#"
index="rowNumber">
<tr>
<cfloop
from="1"
to="#ArrayLen(twodee[rowNumber])#"
index="columnNumber">
<td>
#twodee[rowNumber][columnNumber]#
</td>
</cfloop><br>
</tr></cfloop>
</cfoutput>
</table>

That code produces this screen (see Figure 5):

Working with ColdFusion Array Functions
How do ColdFusion's built-in array functions work on multidimensional arrays? Unfortunately, the ColdFusion documentation does not offer us much guidance on this, so we'll have to put on our lab coats and become scientists. Our first observation should be of the code above that loops over the twodee array. There, we make use of the ArrayLen() function.

The first time we use ArrayLen() is in the outer loop:

<cfloop from="1" to="#ArrayLen(twodee)#" index="rowNumber">

When we use the formulation ArrayLen(array_name), where array_name is a multidimensional array, ColdFusion returns the number of rows in the array, so ArrayLen(twodee) returns "4". But if array_name represents a one-dimensional array, ColdFusion returns the number of columns.

We need to get both rows and columns. Rows, we see, is quite simple - just provide a two-dimensional array to the ArrayLen() function. But to get columns, we must pass ArrayLen() a one-dimensional array - something we don't have. Or do we? Look again at Figure 3. I said that a multidimensional array can be thought of as a series of one-dimensional arrays and one-dimensional arrays are just what we need.

Looked at this way, twodee is a set of four stacked, one-dimensional arrays. We tell ColdFusion that we want to access one of these by providing the array name and an index representing the row number, like this: twodee[1]. That particular formulation represents the first row in our multidimensional array. What number will ArrayLen(twodee[1]) display?

If you said, "five", give yourself full marks. If you said, "four", you might not have seen that, by providing the index along with the array name, we are pointing at the first row, which is a one-dimensional array.

Most of the ColdFusion array functions are designed for one-dimensional arrays and can therefore be used by pointing to a one-dimensional array within a multidimensional array. I've taken the following material from the "ColdFusion Foundations" class I teach, as it illustrates the differences in operation of an array function depending on the type of array. Each of the illustrations assumes the existence of A, a one-dimensional array, and B, a two-dimensional array.

ArrayAppend(A, 'x')
ArrayAppend(B, 'x') Error

ArrayAppend(B[2], 'x')

ArrayAvg(A) 2.5
ArrayAvg(B) Error
ArrayAvg(B[2]) 5

ArrayClear(A) Yes
ArrayClear(B) Yes
ArrayClear(B[2]) Yes

ArrayDeleteAt(A, 2)

ArrayDeleteAt(B, 2)

ArrayDeleteAt(B[2], 2)

ArrayInsertAt(A, 3, 'x')
ArrayInsertAt(B, 2, 'x') Error

ArrayInsertAt(B[2], 2, 'x')

ArrayMax(A) 4
ArrayMax(B) Error
ArrayMax(B[2]) 8

ArrayMin(A) 1
ArrayMin(B) Error
ArrayMin(B[2]) 2

ArrayPrepend(A, 'x')
ArrayPrepend(B, 'x') Error

ArrayPrepend(B[2], 'x')

ArraySet(A, 1, 4, 2)
ArraySet(B, 1, 4, 2) Error

ArraySet(B[2], 1, 4, 2)

ArraySort(A,'numeric','desc')
ArraySort (B, 'numeric', 'desc') Error

ArraySort
(B[2], 'numeric', 'desc')

ArraySum(A) 10
ArraySum(B) Error
ArraySum(B[2]) 20

ArraySwap(A, 3, 2)

ArraySwap(B, 3, 2)

ArraySwap(B[2], 3, 2)

ArrayToList(A) 1,2,3,4
ArrayToList(B) Error
ArrayToList(B[2], '|') 2|4|6|8

Once arrays are explained, their mystery vanishes and they become just what they were invented to be - extraordinarily helpful constructs that can actually make our code simpler. For more on arrays - including arrays of more than two dimensions - and for some exercises in arrays, go to halhelms.com and test your knowledge of arrays with this month's test/exercise.

More Stories By Hal Helms

Hal Helms is a well-known speaker/writer/strategist on software development issues. He holds training sessions on Java, ColdFusion, and software development processes. He authors a popular monthly newsletter series. For more information, contact him at hal (at) halhelms.com or see his website, www.halhelms.com.

Comments (3) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
TenTonJim 02/09/07 05:06:15 PM EST

Great tutorial on the arrays - I am still having trouble though. Say in your example... How would you display a name of the test across the top and the student names down the left column? I have been struggling with this one. Thanks!

Jim S.
http://tentonweb.com/
Jacksonville, FL USA

Hal Helms 02/13/03 12:03:00 AM EST

Glad to hear that, Mike. They really are very simple if you get started with them in the right way.

Mike Elgers 01/15/03 10:15:00 PM EST

I've never quite understood arrays before and stayed away from them. After reading Hal's article, I think they sound really useful. Well written; I learned a lot.

@ThingsExpo Stories
No hype cycles or predictions of zillions of things here. IoT is big. You get it. You know your business and have great ideas for a business transformation strategy. What comes next? Time to make it happen. In his session at @ThingsExpo, Jay Mason, Associate Partner at M&S Consulting, presented a step-by-step plan to develop your technology implementation strategy. He discussed the evaluation of communication standards and IoT messaging protocols, data analytics considerations, edge-to-cloud tec...
Announcing Poland #DigitalTransformation Pavilion
Digital Transformation is much more than a buzzword. The radical shift to digital mechanisms for almost every process is evident across all industries and verticals. This is often especially true in financial services, where the legacy environment is many times unable to keep up with the rapidly shifting demands of the consumer. The constant pressure to provide complete, omnichannel delivery of customer-facing solutions to meet both regulatory and customer demands is putting enormous pressure on...
CloudEXPO | DXWorldEXPO are the world's most influential, independent events where Cloud Computing was coined and where technology buyers and vendors meet to experience and discuss the big picture of Digital Transformation and all of the strategies, tactics, and tools they need to realize their goals. Sponsors of DXWorldEXPO | CloudEXPO benefit from unmatched branding, profile building and lead generation opportunities.
DXWorldEXPO LLC announced today that All in Mobile, a mobile app development company from Poland, will exhibit at the 22nd International CloudEXPO | DXWorldEXPO. All In Mobile is a mobile app development company from Poland. Since 2014, they maintain passion for developing mobile applications for enterprises and startups worldwide.
The best way to leverage your CloudEXPO | DXWorldEXPO presence as a sponsor and exhibitor is to plan your news announcements around our events. The press covering CloudEXPO | DXWorldEXPO will have access to these releases and will amplify your news announcements. More than two dozen Cloud companies either set deals at our shows or have announced their mergers and acquisitions at CloudEXPO. Product announcements during our show provide your company with the most reach through our targeted audienc...
@DevOpsSummit at Cloud Expo, taking place November 12-13 in New York City, NY, is co-located with 22nd international CloudEXPO | first international DXWorldEXPO and will feature technical sessions from a rock star conference faculty and the leading industry players in the world.
Everything run by electricity will eventually be connected to the Internet. Get ahead of the Internet of Things revolution. In his session at @ThingsExpo, Akvelon expert and IoT industry leader Sergey Grebnov provided an educational dive into the world of managing your home, workplace and all the devices they contain with the power of machine-based AI and intelligent Bot services for a completely streamlined experience.
DXWorldEXPO | CloudEXPO are the world's most influential, independent events where Cloud Computing was coined and where technology buyers and vendors meet to experience and discuss the big picture of Digital Transformation and all of the strategies, tactics, and tools they need to realize their goals. Sponsors of DXWorldEXPO | CloudEXPO benefit from unmatched branding, profile building and lead generation opportunities.
22nd International Cloud Expo, taking place June 5-7, 2018, at the Javits Center in New York City, NY, and co-located with the 1st DXWorld Expo will feature technical sessions from a rock star conference faculty and the leading industry players in the world. Cloud computing is now being embraced by a majority of enterprises of all sizes. Yesterday's debate about public vs. private has transformed into the reality of hybrid cloud: a recent survey shows that 74% of enterprises have a hybrid cloud ...
In his keynote at 19th Cloud Expo, Sheng Liang, co-founder and CEO of Rancher Labs, discussed the technological advances and new business opportunities created by the rapid adoption of containers. With the success of Amazon Web Services (AWS) and various open source technologies used to build private clouds, cloud computing has become an essential component of IT strategy. However, users continue to face challenges in implementing clouds, as older technologies evolve and newer ones like Docker c...
"MobiDev is a software development company and we do complex, custom software development for everybody from entrepreneurs to large enterprises," explained Alan Winters, U.S. Head of Business Development at MobiDev, in this SYS-CON.tv interview at 21st Cloud Expo, held Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA.
JETRO showcased Japan Digital Transformation Pavilion at SYS-CON's 21st International Cloud Expo® at the Santa Clara Convention Center in Santa Clara, CA. The Japan External Trade Organization (JETRO) is a non-profit organization that provides business support services to companies expanding to Japan. With the support of JETRO's dedicated staff, clients can incorporate their business; receive visa, immigration, and HR support; find dedicated office space; identify local government subsidies; get...
Dion Hinchcliffe is an internationally recognized digital expert, bestselling book author, frequent keynote speaker, analyst, futurist, and transformation expert based in Washington, DC. He is currently Chief Strategy Officer at the industry-leading digital strategy and online community solutions firm, 7Summits.
Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...
Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...
In past @ThingsExpo presentations, Joseph di Paolantonio has explored how various Internet of Things (IoT) and data management and analytics (DMA) solution spaces will come together as sensor analytics ecosystems. This year, in his session at @ThingsExpo, Joseph di Paolantonio from DataArchon, added the numerous Transportation areas, from autonomous vehicles to “Uber for containers.” While IoT data in any one area of Transportation will have a huge impact in that area, combining sensor analytic...
Charles Araujo is an industry analyst, internationally recognized authority on the Digital Enterprise and author of The Quantum Age of IT: Why Everything You Know About IT is About to Change. As Principal Analyst with Intellyx, he writes, speaks and advises organizations on how to navigate through this time of disruption. He is also the founder of The Institute for Digital Transformation and a sought after keynote speaker. He has been a regular contributor to both InformationWeek and CIO Insight...
Michael Maximilien, better known as max or Dr. Max, is a computer scientist with IBM. At IBM Research Triangle Park, he was a principal engineer for the worldwide industry point-of-sale standard: JavaPOS. At IBM Research, some highlights include pioneering research on semantic Web services, mashups, and cloud computing, and platform-as-a-service. He joined the IBM Cloud Labs in 2014 and works closely with Pivotal Inc., to help make the Cloud Found the best PaaS.
It is of utmost importance for the future success of WebRTC to ensure that interoperability is operational between web browsers and any WebRTC-compliant client. To be guaranteed as operational and effective, interoperability must be tested extensively by establishing WebRTC data and media connections between different web browsers running on different devices and operating systems. In his session at WebRTC Summit at @ThingsExpo, Dr. Alex Gouaillard, CEO and Founder of CoSMo Software, presented ...