menu_links contains the links as they appear in the navigation block (or any other menu block). This is in contrast to the
menu_router table which contains information about callbacks.
In general, only put an entry in
hook_menu if said entry has different callbacks. Because of this, if you put a loop in there with just the title changing but the same access and page callbacks, it's very likely that you wanted to use menu_link_save instead (maybe with a title callback and/or a load function). This function takes an array, with at least a
link_path and a
link_title defined. Other possible key-value pairs:
menu_name default is navigation
weight default is 0
expanded whether the item is expanded.
options An array of options, @see l for more.
mlid Set to an existing value, or 0 or NULL to insert a new link.
plid The mlid of the parent.
router_path The path of the relevant router item.
The menu_links table handling code was designed to be able to handle basically any number of entries. Beware: the user interfaces (book / menu parent chooser and the menu admin overview) in core are not capable of the same, they will be difficult to use above a couple hundred links per menu. On the contrary, the router table is designed to hold as few items as possible.