Carrier Mapping
The PhoneNumberToCarrierMapper identifies the mobile carrier for a phone number. This is useful for displaying carrier information to users or routing calls/messages appropriately.
Carrier mapping works best for mobile numbers and is limited by available data for each country.
Getting Started
Get Mapper Instance
use libphonenumber\ PhoneNumberToCarrierMapper ;
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
Parse a Phone Number
$phoneUtil = \libphonenumber\ PhoneNumberUtil :: getInstance ();
$number = $phoneUtil -> parse ( '798765432' , 'CH' );
Get Carrier Name
// Get carrier name in English
$carrier = $carrierMapper -> getNameForNumber ( $number , 'en' );
echo $carrier ; // "Swisscom"
Basic Usage
use libphonenumber\ PhoneNumberUtil ;
use libphonenumber\ PhoneNumberToCarrierMapper ;
$phoneUtil = PhoneNumberUtil :: getInstance ();
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
// Parse a Swiss mobile number
$swissNumber = $phoneUtil -> parse ( '798765432' , 'CH' );
// Get carrier name
$carrier = $carrierMapper -> getNameForNumber ( $swissNumber , 'en' );
echo $carrier ; // Output: Swisscom
Localized Carrier Names
Carrier names can be returned in different languages:
$phoneUtil = PhoneNumberUtil :: getInstance ();
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
$mobileNumber = $phoneUtil -> parse ( '798765432' , 'CH' );
// English
echo $carrierMapper -> getNameForNumber ( $mobileNumber , 'en' );
// Output: Swisscom
// German
echo $carrierMapper -> getNameForNumber ( $mobileNumber , 'de' );
// Output: Swisscom (same in this case)
// French
echo $carrierMapper -> getNameForNumber ( $mobileNumber , 'fr' );
// Output: Swisscom
Use the user’s locale to display carrier names in their preferred language when available.
Working with Valid Numbers
For better performance with pre-validated numbers:
$phoneUtil = PhoneNumberUtil :: getInstance ();
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
$number = $phoneUtil -> parse ( '+41 79 876 54 32' , null );
// Validate first
if ( $phoneUtil -> isValidNumber ( $number )) {
// More efficient if already validated
$carrier = $carrierMapper -> getNameForValidNumber ( $number , 'en' );
echo $carrier ; // Swisscom
}
Safe Display Names
Get a safe carrier name that handles edge cases:
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
$phoneUtil = PhoneNumberUtil :: getInstance ();
$number = $phoneUtil -> parse ( '798765432' , 'CH' );
// Returns carrier name or empty string (never null)
$carrier = $carrierMapper -> getSafeDisplayName ( $number , 'en' );
if ( empty ( $carrier )) {
echo "Carrier information not available" ;
} else {
echo "Carrier: $carrier " ;
}
Handling Different Number Types
Carrier mapping works primarily for mobile numbers:
$phoneUtil = PhoneNumberUtil :: getInstance ();
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
// Mobile number - likely to have carrier data
$mobile = $phoneUtil -> parse ( '07400 123456' , 'GB' );
$type = $phoneUtil -> getNumberType ( $mobile );
if ( $type === \libphonenumber\ PhoneNumberType :: MOBILE ) {
$carrier = $carrierMapper -> getNameForNumber ( $mobile , 'en' );
echo $carrier ?: 'Unknown carrier' ;
}
// Landline - typically no carrier data
$landline = $phoneUtil -> parse ( '0117 496 0123' , 'GB' );
$carrier = $carrierMapper -> getNameForNumber ( $landline , 'en' );
echo $carrier ; // Likely empty string
Supported number types:
Mobile numbers: Usually have carrier data
Pager numbers: May have carrier data
Fixed-line-or-mobile: May have carrier data
Other types (landline, toll-free, etc.): Typically no carrier data
Mobile Number Portability
Carrier information may be inaccurate in countries with mobile number portability (MNP), where users can keep their number when switching carriers.
// Example: User may have moved from original carrier
$phoneUtil = PhoneNumberUtil :: getInstance ();
$carrierMapper = PhoneNumberToCarrierMapper :: getInstance ();
$number = $phoneUtil -> parse ( '+1 415 555 0123' , 'US' );
$carrier = $carrierMapper -> getNameForNumber ( $number , 'en' );
// This returns the original carrier based on number prefix
// May not reflect current carrier if number was ported
echo "Original carrier: $carrier " ;
Don’t rely on carrier information for routing decisions in countries with active MNP programs. The data represents the original allocation, not necessarily the current carrier.
Practical Examples
Data Availability
Carrier data availability varies by country:
Countries with Good Coverage
Switzerland (CH)
United States (US)
United Kingdom (GB)
Germany (DE)
Many other major markets
Some smaller countries
Countries where carrier data isn’t publicly available
Recently assigned number ranges
Checking Data Availability
$carrier = $carrierMapper -> getNameForNumber ( $number , 'en' );
if ( empty ( $carrier )) {
// No carrier data available
// Could be:
// - Not a mobile number
// - No data for this country
// - Recently assigned range
}
Best Practices
Check Number Type First Verify it’s a mobile number before attempting carrier lookup
Handle Empty Results Always check for empty strings - not all mobile numbers have carrier data
Beware of Number Portability Don’t use for routing in MNP countries - data may be outdated
Use for Display Only Best used for showing information to users, not for system logic
Limitations
What carrier mapping cannot do:
Guarantee accuracy in countries with mobile number portability
Provide real-time carrier information
Work reliably with non-mobile numbers
Detect MVNOs (Mobile Virtual Network Operators) in all cases
Next Steps
Geocoding Get geographic location information
Timezone Mapping Determine timezone information from numbers
Carrier Mapper API Complete API reference for carrier mapping
Number Types Understanding phone number types