CodeIgniter crea navegación profunda de nivel n

Me gustaría un poco de ayuda por favor. He creado una barra de navegación de menú dinámica que muestra los elementos del menú según el orden en que los configuré. Estoy usando estoanidado para ordenar los elementos de mi menú, pero actualmente mi menú tiene solo 2 niveles, así que básicamente es así:

Item1
Item2
 > Subitem2.1
 > Subitem2.2
Item3
etc etc.

Lo que me gustaría hacer es hacerlo con n niveles, así que básicamente algo como esto:

Item1
Item2
  > Subitem2.1
    >> Subitem2.1.1
  > Subitem2.2
Item3
etc etc.

y cada elemento puede ir a nivel n profundo. El problema es que si configuro un nuevo pedido para mis elementos de menú que tiene más de 2 niveles de profundidad, obtengo un error y el pedido no se almacena en la base de datos. ¿Cómo puedo solucionar esto, por favor?

La estructura de la base de datos es esta:

table: Menu
id (pk)
menu_item
parent_id // it is the id of the parent menu item
order

Aquí están mis funciones principales (modelo):

// save the order of the menu items
public function save_order($items){
    if (count($items)>0) {
        foreach ($items as $order => $item) {
            if ($item['item_id'] != '') {

                $data = array(
                    'parent_id' => (int)$item['parent_id'], 
                    'order'     => $order
                );

                $this->db->set($data)
                ->where($this->_primary_key, $item['item_id'])
                ->update($this->_table_name);
            }
        }
    }
}

// fetch the menu items (parents & children) from the last order set
public function get_menu(){

    $this->db->select('id, menu_item, parent_id');
    $this->db->order_by('parent_id, order');
    $menu_items = $this->db->get('menu')->result_array();

    $arr = array();
    foreach ($menu_items as $item) {

        // the item has no parent
        if (!$item['parent_id']) {
            $arr[$item['id']] = $item; // e.g. $arr(4 => array())
        } // the item is a child
        else {
            // e.g. $arr(4 => array('children' => array()))
            $arr[$item['parent_id']]['children'][] = $item;
        }
    }
    return $arr;
 } 
Actualizar

Para obtener ayuda adicional: hice una prueba y volqué la matriz de los elementos en la pantalla en ambos casos:

1er caso: con 2 niveles (como es actualmente): configuro los elementos con este orden

Objeto 1Item2Item4Item3Item5

y el resultado se ve así, como se esperaba:

Array
(
    [1] => Array
        (
            [id] => 1
            [menu_item] => Item1
            [parent_id] => 0
        )

    [2] => Array
        (
            [id] => 2
            [menu_item] => Item2
            [parent_id] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [menu_item] => Item4
                            [parent_id] => 2
                        )

                )

        )

    [3] => Array
        (
            [id] => 3
            [menu_item] => Item3
            [parent_id] => 0
        )

    [5] => Array
        (
            [id] => 5
            [menu_item] => Item5
            [parent_id] => 0
        )

)

2do caso: con n niveles: intenté configurar los elementos del menú con este orden:

Objeto 1Item2Item5Item4Item3

y el resultado se ve así:

Array
(
    [1] => Array
        (
            [id] => 1
            [menu_item] => Item1 
            [parent_id] => 0
        )

    [2] => Array
        (
            [id] => 2
            [menu_item] => Item2
            [parent_id] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [menu_item] => Item5
                            [parent_id] => 2
                        )

                )

        )

    [3] => Array
        (
            [id] => 3
            [menu_item] => Item3
            [parent_id] => 0
        )

    [4] => Array
        (
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 4
                            [menu_item] => Item4
                            [parent_id] => 4
                        )

                )

        )

)

Este es el caso donde me sale el error y no funciona. Los errores que obtengo son:

Mensaje: Índice indefinido: page_id Mensaje: Índice indefinido: menu_item

en mi archivo de vista:

function nav($menu_items, $child = false){
    $output = '';

    if (count($array)) {
        $output .= ($child === false) ? '<ol class="sortable">' : '<ol>' ;

        foreach ($menu_items as $item) {
            $output .= '<li id="list_' . $item['id'] . '">'; // here is the line of the 1st error
            $output .= '<div>' . $item['menu_item'] . '</div>'; // 2nd error

            //check if there are any children
            if (isset($item['children']) && count($item['children'])) {
                $output .= nav($item['children'], true);
            }
            $output .= '</li>';
        }
        $output .= '</ol>';
    }
    return $output;
}


echo nav($menu_items); 

Respuestas a la pregunta(1)

Su respuesta a la pregunta