The return property of exclamation in front of array
t() uses format_string(), which uses strtr(). For this reason, your second example snippet works. Since format_str() is using the following code, any token that starts with a character different from !, %, or @ is treated as if the token started with %.

  foreach ($args as $key =&gt; $value) {
    switch ($key[0]) {
      case '@':
        // Escaped only.
        $args[$key] = check_plain($value);
        break;

      case '%':
      default:
        // Escaped and placeholder.
        $args[$key] = drupal_placeholder($value);
        break;

      case '!':
        // Pass-through.
    }
  }


drupa_placeholder() is the responsible for escaping some characters, since it calls check_plain().

function drupal_placeholder($text) {
  return '&lt;em class="placeholder"&gt;' . check_plain($text) . '&lt;/em&gt;';
}


As side note, since $arrays is inside a single-quote string, PHP doesn't replace it with the value of the $arrays string. If you wanted to put the content of a string into the string passed to t(), you should use a t()-placeholder, which starts with !, %, or @.