PHPackages                             geoffreyrose/rank-phone-numbers - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. geoffreyrose/rank-phone-numbers

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

geoffreyrose/rank-phone-numbers
===============================

Find The Best Phone Number! PHP + Laravel Facade

v0.4.0(1y ago)20MITPHPPHP ^8.4

Since Feb 5Pushed 1y ago1 watchersCompare

[ Source](https://github.com/geoffreyrose/rank-phone-numbers)[ Packagist](https://packagist.org/packages/geoffreyrose/rank-phone-numbers)[ RSS](/packages/geoffreyrose-rank-phone-numbers/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (5)Dependencies (1)Versions (6)Used By (0)

[![Latest Stable Version](https://camo.githubusercontent.com/4d9712e532379c16333ed09f73c2c940072f62cfd5ee23576aef7de6a78ac3d2/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f67656f6666726579726f73652f72616e6b2d70686f6e652d6e756d626572733f7374796c653d666c61742d737175617265)](https://packagist.org/packages/geoffreyrose/rank-phone-numbers)[![License](https://camo.githubusercontent.com/f7b00c7992c6dcba1b363ca2b9e5df395620b6c9a45e203b7bddaf6fd7c90d4f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f67656f6666726579726f73652f72616e6b2d70686f6e652d6e756d626572733f7374796c653d666c61742d737175617265)](https://github.com/geoffreyrose/rank-phone-numbers/blob/main/LICENSE)

!!IN BETA!!
===========

[](#in-beta)

Find The Best Phone Number! PHP + Laravel Facade
================================================

[](#find-the-best-phone-number--php--laravel-facade)

A PHP/Laravel package to rank phone numbers to help you find the best ones. Great for when you have a list of phone numbers, and you want to find the best one to use.

Works great with Twilio, Bandwidth, Vonage, SignalWire or any other programmable communication provider to help you find the best phone number to use.

### Requirements

[](#requirements)

- PHP 8.4+

### Usage

[](#usage)

#### Installation

[](#installation)

```
composer require geoffreyrose/rank-phone-numbers

```

### With Plain PHP

[](#with-plain-php)

```
use RankPhoneNumbers\RankPhoneNumbers;

...
$myNumbers = ['18005557184', '18005554030'];
$rankPhoneNumbers = new RankPhoneNumbers\RankPhoneNumbers;
$rankPhoneNumbers->setPhoneNumbers($myNumbers);
$ranked = $rankPhoneNumbers->rank();

// $ranked
[
    [0] => (object) [
        "phone_number" => "18005554030"
        "rank_phone_number_points" => 175
        "rank_phone_number_word_match_end" => []
    ],
    [1] => (object) [
        "phone_number"] => "18005557184"
        "rank_phone_number_points" => 0
        "rank_phone_number_word_match_end" =>  []
    ]
]
```

### With Laravel Facade

[](#with-laravel-facade)

Laravel uses Package Auto-Discovery, which doesn't require you to manually add the ServiceProvider and Facade.

```
$myNumbers = ['18005557184', '18005554030'];
$rankPhoneNumbers = RankPhoneNumbers::setPhoneNumbers($myNumbers);
$ranked = $rankPhoneNumbers->rank();

// $ranked
[
    [0] => (object) [
        "phone_number" => "18005554030"
        "rank_phone_number_points" => 175
        "rank_phone_number_word_match_end" => []
    ],
    [1] => (object) [
        "phone_number"] => "18005557184"
        "rank_phone_number_points" => 0
        "rank_phone_number_word_match_end" =>  []
    ]
]
```

### Example

[](#example)

```
$twilioNumbers = [
    (object) [
        "highlighted" => "+15095554030",
        "friendlyName" => "(509) 555-4030",
        "phoneNumber" => "+15095554030",
        "locality" => "Omak",
        "region" => "WA",
        "postalCode" => "98841",
        "lata" => "676",
        "rateCenter" => "OMAK",
        "latitude" => "48.364700",
        "longitude" => "-119.270400",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true
    ],
    (object) [
        "highlighted" => "+15095557780",
        "friendlyName" => "(509) 555-7780",
        "phoneNumber" => "+15095557780",
        "locality" => "Ritzville",
        "region" => "WA",
        "postalCode" => "99169",
        "lata" => "676",
        "rateCenter" => "RITZVILLE",
        "latitude" => "47.079600",
        "longitude" => "-118.470500",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true
    ],
    (object) [
        "highlighted" => "+15095558683",
        "friendlyName" => "(509) 555-8683",
        "phoneNumber" => "+15095558683",
        "locality" => "Ritzville",
        "region" => "WA",
        "postalCode" => "99169",
        "lata" => "676",
        "rateCenter" => "RITZVILLE",
        "latitude" => "47.079600",
        "longitude" => "-118.470500",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true
    ]
];

$rankPhoneNumbers = RankPhoneNumbers::setPhoneNumbers($twilioNumbers);
$rankPhoneNumbers->setPhoneNumbersKeyName('phoneNumber');
$ranked = $rankPhoneNumbers->rank();
// $ranked

[
    [0] => (object) [
        "highlighted" => "+15095557780",
        "friendlyName" => "(509) 555-7780",
        "phoneNumber" => "+15095557780",
        "locality" => "Ritzville",
        "region" => "WA",
        "postalCode" => "99169",
        "lata" => "676",
        "rateCenter" => "RITZVILLE",
        "latitude" => "47.079600",
        "longitude" => "-118.470500",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true,
        "rank_phone_number_points" => 225
        "rank_phone_number_word_match_end" =>  []
    ],
    [1] => (object) [
        "highlighted" => "+15095554030",
        "friendlyName" => "(509) 555-4030",
        "phoneNumber" => "+15095554030",
        "locality" => "Omak",
        "region" => "WA",
        "postalCode" => "98841",
        "lata" => "676",
        "rateCenter" => "OMAK",
        "latitude" => "48.364700",
        "longitude" => "-119.270400",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true,
        "rank_phone_number_points" => 175
        "rank_phone_number_word_match_end" =>  []
    ],
    [2] => (object) [
        "highlighted" => "+15095558683",
        "friendlyName" => "(509) 555-8683",
        "phoneNumber" => "+15095558683",
        "locality" => "Ritzville",
        "region" => "WA",
        "postalCode" => "99169",
        "lata" => "676",
        "rateCenter" => "RITZVILLE",
        "latitude" => "47.079600",
        "longitude" => "-118.470500",
        "isoCountry" => "US",
        "addressRequirements" => "none",
        "beta" => false,
        "capabilities" => (object)[
            "voice" => true,
            "SMS" => true,
            "MMS" => true
        ],
        "request_number" => true,
        "rank_phone_number_points" => 80
        "rank_phone_number_word_match_end" => [
            "vote"
        ]
    ]
];
```

Methods
-------

[](#methods)

### setPhoneNumbers(array $phoneNumbers): self

[](#setphonenumbersarray-phonenumbers-self)

Sets the phone numbers to be ranked

### setPhoneNumbersKeyName(string $phoneNumbersKeyName): self

[](#setphonenumberskeynamestring-phonenumberskeyname-self)

Sets the key name of the phone number when using an associative array or object

### addRule($rule): self

[](#addrulerule-self)

Adds a rule to the ranking system. Must extend \\RankPhoneNumbers\\Abstracts\\RuleAbstract

### addWordRule($rule): self

[](#addwordrulerule-self)

Adds a word rule to the ranking system. Must extend \\RankPhoneNumbers\\Abstracts\\WordRuleAbstract

### rank(): array

[](#rank-array)

Ranks the phone numbers. Returning an array of the phone numbers sorted by rank.

Includes the rank\_phone\_number\_points and rank\_phone\_number\_word\_match\_end properties.

Rules
-----

[](#rules)

### Default Rules

[](#default-rules)

Rules look at last four digits of the phone number.

- double\_match (100 Points) // 2323
- ends\_in\_zero\_or\_five (50 Points) // XXX0 or XXX5
- funny\_69 (10 Points) // XX69
- funny\_420 (10 Points) // X420
- partial\_sequential\_numbers (90 Points) // 123X or X134, etc
- pattern\_135 (60 Points) // 135X or X135
- pattern\_246 (60 Points) // 246X or X246
- pattern\_357 (60 Points) // 357X or X357
- pattern\_369 (60 Points) // 369X or X369
- pattern\_468 (60 Points) // 468X or X468
- pattern\_579 (60 Points) // 579X or X579
- pattern\_642 (60 Points) // 642X or X642
- pattern\_753 (60 Points) // 753X or X753
- pattern\_864 (60 Points) // 864X or X864
- pattern\_963 (60 Points) // 963X or X963
- pattern\_975 (60 Points) // 975X or X975
- pattern\_two\_increment (60 Points) // 123X or X123
- pattern\_x2y2 (50 Points) // X2Y2
- repeats\_in\_a\_row (100 Points) // 2323
- same\_numbers (75 Points) // 2XX2, 2X2X 22XX, 22X2, 222X, etc
- sequential\_numbers (100 Points) // 1234
- song\_865 (10 Points) // X865 or 865X
- song\_5309 (100 Points) // 5309
- symmetrical (100 Points) // 5225, 1221, etc
- two\_from\_end\_is\_zero\_or\_five (50 Points) // XX0X or XX5X

### Modify Rules

[](#modify-rules)

```
$rankPhoneNumbers = new RankPhoneNumbers\RankPhoneNumbers;
$rankPhoneNumbers->setPhoneNumbers($phoneNumbers);
$rankPhoneNumbers->rules['repeats_in_a_row']->points = 123;
```

### Add Rule

[](#add-rule)

```
namespace App;

use RankPhoneNumbers\Abstracts\RuleAbstract;

class MyCustomRule extends RuleAbstract
{
    public function __construct()
    {
        $this->pattern = '/3792/';
        $this->points = 500;
        $this->name = 'my_custom_rule';
    }
}

...

$rankPhoneNumbers = new RankPhoneNumbers\RankPhoneNumbers;
$rankPhoneNumbers->addRule(new App\MyCustomRule);
```

### Word Rules

[](#word-rules)

The list of words that is checked against is mostly the words from the Oxford 5000, which is a list of 5000 words you should understand for a1-b2 english literacy. The list is trimmed down to be about 3000 words that are length 4-7 long.

Checks the last four, five, six, and seven letters of the phone number to see if it is a word in T9 conversion.

### Default Word Rules

[](#default-word-rules)

- word\_is\_last\_four (5 Points)
- word\_is\_last\_five (5 Points)
- word\_is\_last\_six (5 Points)
- word\_is\_last\_seven (5 Points)

### Modify Word Rules

[](#modify-word-rules)

```
$rankPhoneNumbers = new RankPhoneNumbers\RankPhoneNumbers;
$rankPhoneNumbers->wordRules['word_is_last_four']->points = 75;
```

### Rule Abstracts and Word Rule Abstracts

[](#rule-abstracts-and-word-rule-abstracts)

All defaults can be updated as needed.

For example, to change the points of a rule:

```
$rankPhoneNumbers = new RankPhoneNumbers\RankPhoneNumbers;
$rankPhoneNumbers->wordRules['word_is_last_four']->points = 75;
$rankPhoneNumbers->rules['repeats_in_a_row']->points = 123;`
```

#### Rule Properties

[](#rule-properties)

- name: string
- points: int
- pattern: string

#### Word Rule Properties

[](#word-rule-properties)

If you want to disable a specific word rule, set `isActive` to false.

- name: string
- points: int
- isActive: bool
- endingDigitsToCheck: int

TODO
----

[](#todo)

- Add Tests
- Documentation
- Add to or use a different word list

###  Health Score

26

—

LowBetter than 40% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity3

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Total

5

Last Release

542d ago

PHP version history (2 changes)v0.1.0PHP ^8.3

v0.3.0PHP ^8.4

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3210702?v=4)[Geoffrey Rose](/maintainers/geoffreyrose)[@geoffreyrose](https://github.com/geoffreyrose)

---

Top Contributors

[![geoffreyrose](https://avatars.githubusercontent.com/u/3210702?v=4)](https://github.com/geoffreyrose "geoffreyrose (15 commits)")

---

Tags

laravelphpvoipphone-numbervoipVirtual Phone NumberPhone Number Ranking

###  Code Quality

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/geoffreyrose-rank-phone-numbers/health.svg)

```
[![Health](https://phpackages.com/badges/geoffreyrose-rank-phone-numbers/health.svg)](https://phpackages.com/packages/geoffreyrose-rank-phone-numbers)
```

###  Alternatives

[brick/phonenumber

Phone number library

4258.0M70](/packages/brick-phonenumber)[odolbeau/phone-number-bundle

Integrates libphonenumber into your Symfony application

24911.5M22](/packages/odolbeau-phone-number-bundle)[marcelog/pami

Asterisk Manager Interface (AMI) client for PHP, event driven, object oriented

414780.7k1](/packages/marcelog-pami)[log1x/acf-phone-number

A real ACF phone number field.

12078.0k](/packages/log1x-acf-phone-number)[chan-sccp/pami

Asterisk Manager Interface (AMI) client for PHP, event driven, object oriented (Fork)

2955.3k](/packages/chan-sccp-pami)[rtckit/sip

SIP protocol implementation written in PHP

4320.1k2](/packages/rtckit-sip)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
