Why does my widget break other widgets?

I can already see a problem. It is your use of switch_to_blog(). You are potentially doing multiple switch_to_blog() calls; calling restore_current_blog() once at the end of the loop is meaningless. Please review the codex with examples – http://codex.wordpress.org/Function_Reference/switch_to_blog

A quick fix is putting restore_current_blog() within the foreach loop. What happens if you do not use switch_to_blog() and restore_current_blog() correctly is that WP globals are disrupted and potentially break WP APIs called afterwards.