If you always use the same syntax:
firstName lastName - ID: XXX
including all the spacing, you can use scanf to get what you need as well:
list($fname, $lname, $id) = sscanf($itm, '%s %s - ID: %s');
printf("Name: %s %s, id: %s" . PHP_EOL, $fname, $lname, $id);
Where $itm is the string. $id will contain just the id portion. You can assign directly to an array if you want instead of extracting the variables with the list.
Overall, the substr and strpos will be faster than a scanf (albeit nominal difference overall), but the scanf does provide multiple return results. So if you can make use of the first and last name as well as the id, then a scanf would be more suitable. If you only want the id and have no need for any of the other data, than use a substr.