2D arrays can be done in lpc, quite simply. Just treat them as an array of arrays. So, a = allocate(10); a[0] = allocate(10); etc... and you can reference array 0, element 0, by a[0][0] That's been around since arrays have been around. You can't declare an array of more than 1 dimension (using the type * notation, if you have type checking on), but you can have array of more than one dimension. If you have type checking on, you have to declare them as mixed * type, though. This also works: mixed *a; a = ({ ({1, 2, 3}), ({1, 2, 3}) }); So, a[0] would be ({1, 2, 3}), and a[0][2] would be 3. Or this: mixed *a; /* please note the mixed * declaration is only for type checking and means that this is an array of any type */ a = ({0, 0, 0, 0}); /* just to get the array to size 4 */ a[0] = ({1, 2, 3}); a[1] = ({1, 2, 3}); etc... I use multidimensional arrays everywhere, usually doing things in a loop: a = allocate(10); for (i=0; i<10; ++i) { string str; str = read_file(path, i+1); str = extract(str, 0, strlen(str)-2); /* to get rid of the \n */ a[i] = explode(str, '#'); } (thanks to John Price, a.k.a. Raistlin for this explanation)