I think I found a way to massage @EdMorton "copy_array" implemntation, into something that "flattens" the true multi-dimensional array:
$ cat flatten.awk
BEGIN {
arr["a"]["a"] = 21
arr["a"]["b"] = 21
arr["b"]["a"] = 2
arr["b"]["b"] = 3
arr["c"]["a"] = 4
arr["d"]["x"]["y"]= 90
arr["d"]["x"]["z"]= 95
walk_array(arr, "arr")
PROCINFO["sorted_in"]="@val_num_asc"
flatten_array(arr, flatten, "")
print "----------"
walk_array(flatten, "flatten")
}
function flatten_array(orig, flatten, idx, i)
{
for (i in orig) {
if (isarray(orig[i])) {
flatten_array(orig[i], flatten, (length(idx) ? (idx SUBSEP i) : i) )
}
else {
#printf("idx->[%s]\n", idx) > "/dev/stderr"
flatten[idx SUBSEP i] = orig[i]
}
}
}
function walk_array(arr, name, i)
{
for (i in arr) {
if (isarray(arr[i]))
walk_array(arr[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n", name, i, arr[i])
}
}
$ gawk -f flatten.awk
arr[a][a] = 21
arr[a][b] = 21
arr[b][a] = 2
arr[b][b] = 3
arr[c][a] = 4
arr[d][x][y] = 90
arr[d][x][z] = 95
----------
flatten[ba] = 2
flatten[bb] = 3
flatten[ca] = 4
flatten[aa] = 21
flatten[ab] = 21
flatten[dxy] = 90
flatten[dxz] = 95
Not particularly graceful, but... Unless someone else can offer an alternative...