Skip to main content
Ben Nadel at InVision In Real Life (IRL) 2019 (Phoenix, AZ) with: James Edward Murray and Connor Murphy and Drew Newberry and Alvin Mutisya and Nick Miller and Jack Neil
Ben Nadel at InVision In Real Life (IRL) 2019 (Phoenix, AZ) with: James Edward Murray@Edward_Speaks ) , Connor Murphy@atconnormurphy ) , Drew Newberry , Alvin Mutisya@AlvinMutisya ) , Nick Miller , and Jack Neil@JackNeil_ )

Using Array-Like Structs As Arrays In Lucee CFML

By on

The other day, when I was working on unifying type casting errors in Lucee CFML, I spent some time digging around in the Lucee source code on GitHub looking for examples of casting error messages. As I was doing this, I came across a Java class called StructAsArray. This wrapper class appears to allow array-like Structs to be treated as Arrays in some scenarios. I don't recall ever seeing this discussed; so, I wanted to perform a quick experiment in Lucee CFML

Based on the code that I am seeing in the Java class, it looks like this "Arrayish" wrapper depends on the keys in the Struct being composed entirely of integer values. This makes sense since - depending on how hard you squint - an Array can be thought of as a Struct that associates numeric indices with values (and has a predictable iteration sequence).

That said, let's try to create a Struct with numeric keys and see what happens:


	arrayish = {
		1: "First Value",
		2: "Second Value",
		3: "Third Value"
		// NOTE: Array-like structures with a "sparse" distribution of keys don't really
		// work the way they would with a true array. It seems they should be avoided.
		// --
		// 10: "Sparse Value"

	// NOTE: Member-methods don't work consistently (since this is actually a Struct). As
	// such, BIFs (built-in functions) are safest for array-like structures.
	echo( "Length: #arrayLen( arrayish )# <br />" );
	echo( "First: #arrayFirst( arrayish )# <br />" );
	echo( "Last: #arrayLast( arrayish )# <br />" );
	echo( "<br />" );

	// Try looping using array-iteration.
		index = "i"
		value = "value"
		array = arrayish

		echo( "#i# : #value# <br />" );


	arrayDeleteAt( arrayish, 1 );
	arrayPrepend( arrayish, "Prepended value" );
	arrayAppend( arrayish, "Appeneded value" );

	echo( "<br />" );
	dump( arrayish );


As you can see, our Struct variable, arrayish, is just a normal Struct that happens to have keys that look like array indices. Of course, the object is still a Struct, which means that the member methods are all "struct" member methods. As such, we have to use the Built-In Functions (BIFs) for Arrays in to get this wrapper behavior for Structs to work.

That said, when we run the above code, we get the following output:

An array-like struct being treated as an Array in Lucee CFML.

As you can see, since our Struct looks like an Array, we can treat it like an array in a subset of Array use-cases.

To be honest, I don't have an immediate use-case for this. It was just a curiosity. I assume this is something that Lucee CFML is using internally? Does anyone have a good example of where something like this might be helpful?

Want to use code from this post? Check out the license.

Reader Comments

Post A Comment — I'd Love To Hear From You!

NEW: Some basic markdown formatting is now supported: bold, italic, blockquotes, lists, fenced code-blocks. Read more about markdown syntax »
Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.