I too would like answers to these questions. 

I tried:

template <typename T>
void display_array_3d( T& array_3d )
{
    int z_dim = array_3d.shape()[0];
    int y_dim = array_3d.shape()[1];
    int x_dim = array_3d.shape()[2];
   
    if( x_dim > 0 && y_dim > 0 ){
        for( int z = 0; z < z_dim; z++ ){
        for( int y = 0; y < y_dim; y++ ){
        for( int x = 0; x < x_dim; x++ ){
            printf( "\t%f", array_3d[z][y][x] );
        }
            printf( "\n" );
        }
            printf( "\n" );
        }
        return;
    }

    if( y_dim > 0 ){
        for( int z = 0; z < z_dim; z++ ){
        for( int y = 0; y < y_dim; y++ ){
            printf( "\t%f", array_3d[z][y] );
        }
            printf( "\n" );
        }
        return;
    }

    if( z_dim > 0 ){
        for( int z = 0; z < z_dim; z++ ){
            printf( "\t%f", array_3d[z] );
        }
        return;
    }

}

void test_3d_to_2d_matrix( void )
{

    int z_dim = 2;
    int y_dim = 3;
    int x_dim = 4;

    boost::shared_ptr<float> array_3d_data = boost::shared_ptr<float>( new float[x_dim * y_dim * z_dim] );
    for( int i = 0; i< x_dim * y_dim * z_dim; i++){
        (array_3d_data.get())[i] = i;
    }


    typedef boost::multi_array_ref<float, 3> array_type;
    typedef array_type index;

    array_type a_3d_array( array_3d_data.get(), boost::extents[z_dim][y_dim][x_dim] );

    printf( "a_3d_array\n" );
    display_array_3d<array_type>( a_3d_array );

    boost::multi_array<float, 2> t_mat = eye( 4, 4 );

    typedef boost::multi_array_types::index_range range;
    array_type::index_gen indices;



    for( int mat_i = 0; mat_i < z_dim; mat_i++ )
    {
        array_type::array_view<3>::type p_mat_view = a_3d_array[ boost::indices[range(mat_i, mat_i)][range(0,2)][range(0,3)] ];   
        //display_matrix<float,3>( p_mat_view );
    }

    array_type::array_view<3>::type row_1 = a_3d_array[ boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];
    array_type::array_view<3>::type row_2 = a_3d_array[ boost::indices[range(0, z_dim)][range(1,2)][range(0,1)] ];
    printf( "row_1\n" );
    display_array_3d<array_type::array_view<3>::type>( row_1 );
    printf( "\n" );

    printf( "row_2\n" );
    display_array_3d<array_type::array_view<3>::type>( row_2 );
    printf( "\n" );

    printf( "swap\n" );
    std::swap( row_1, row_2 );

    printf( "row_1\n" );
    display_array_3d<array_type::array_view<3>::type>( row_1 );
    printf( "\n" );

    printf( "row_2\n" );
    display_array_3d<array_type::array_view<3>::type>( row_2 );
    printf( "\n" );


    printf( "a_3d_array\n" );
    display_array_3d<array_type>( a_3d_array );
}


int main( void )
{
    test_3d_to_2d_matrix();

}


and received:

a_3d_array
        0.000000        1.000000        2.000000        3.000000
        4.000000        5.000000        6.000000        7.000000
        8.000000        9.000000        10.000000       11.000000

        12.000000       13.000000       14.000000       15.000000
        16.000000       17.000000       18.000000       19.000000
        20.000000       21.000000       22.000000       23.000000

row_1
        0.000000

        12.000000


row_2
        4.000000

        16.000000


swap
row_1
        4.000000

        16.000000


row_2
        4.000000

        16.000000


a_3d_array
        4.000000        1.000000        2.000000        3.000000
        4.000000        5.000000        6.000000        7.000000
        8.000000        9.000000        10.000000       11.000000

        16.000000       13.000000       14.000000       15.000000
        16.000000       17.000000       18.000000       19.000000
        20.000000       21.000000       22.000000       23.000000

which is not what I was expecting... but almost

And I am only left with more questions like

5) how to create views which are a minimum number of dimensions

such as:

  array_type::array_view<1>::type row_1 = a_3d_array[ boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];

and not:
  array_type::array_view<3>::type row_1 = a_3d_array[ boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];


with out getting:

2>..\..\..\..\..\source\Matlab\lib\dsaLib\matrix\src\matrix_test_app.cpp(82) : error C2440: 'initializing' : cannot convert from 'boost::detail::multi_array::multi_array_view<T,NumDims>

due to the dimensionality miss match.