Iterate through a 2D array. Kotlin extension method
s/forEach2d/forEach2D/


Meaning: "2d" can mean two-dimensional but it can also mean "second" while "2D" is unequivocally an abbreviation for two-dimensional.
Consistency: In java.awt.geom, there is a Point2D and no Point2d.
Convention:


Naming Style - Coding Conventions - Kotlin Programming Language
Code Conventions for the Java Programming Language: 9. Naming Conventions


Make it an inline function for performance reasons.
Consider renaming outer and inner. At first glance a reader might think that outer and inner refer to the outer array and an inner array but this isn't the case as outer is in fact an inner array and inner is an element in an inner array. e.g. s/outer/array/g/ and s/inner/element/g.
Optionally omit the braces on the 'for' loops. I don't feel strongly about this one either way. I personally keep them but for something as simple as this where there really isn't any logic it makes me wonder why explode it into so many lines. However, I've worked on teams where it is our convention to always use braces for if/for/etc. constructs so be consistent above being brief.
Document your Kotlin Code. It may seem like a small thing but it can also be surprisingly amazing how much more real/professional/reusable/etc. your code is once you and others can discover methods and documentation is right there explaining exactly what it does and doesn't do.


Example:

/**
 * Performs the given [action] on each element in each array.
 */
inline fun &lt;T&gt; Array&lt;Array&lt;T&gt;&gt;.forEach2D(action: (T) -&gt; Unit): Unit {
    for (array in this) for (element in array) action(element)
}