How to hide menu item from high level roles but show for low level
As per the discussion above,

Remove 'access callback' =&gt; 'learning_access', add drupal_access_denied() in page call back

function learning_menu() {
  $items = array();

  $items['learning'] = array(
    'page callback' =&gt; 'learning_output',
    'type' =&gt; MENU_CALLBACK,
  );

  return $items;
}



function learning_output() {
  global $user;

  $n = count($user-&gt;roles);
  if ($n === 1) {
    $data = array_values($user-&gt;roles);
    if ($data[0] === 'authenticated user') {
      drupal_access_denied();
    } else {
      //YOUR code Here      
    }
  }
}


And Use Roles for Menu module to hide the learning menu.


  This module allows you to restrict access to menu items based on user
  roles. It is used when you don't want to copy your whole menu just
  because for one specific role you want to hide one menu item.
  
  The module will add a fieldset with options for restricting access or
  gaining access to menu link for a specific role/roles