PHPackages                             paulemich/card-deck - 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. paulemich/card-deck

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

paulemich/card-deck
===================

A card deck library with modular shufflers

v0.1.0(3mo ago)01MITPHPPHP ^8.1

Since Mar 12Pushed 3mo agoCompare

[ Source](https://github.com/PaulEmich/card-deck)[ Packagist](https://packagist.org/packages/paulemich/card-deck)[ RSS](/packages/paulemich-card-deck/feed)WikiDiscussions main Synced 2w ago

READMEChangelogDependencies (3)Versions (2)Used By (0)

Card Deck
=========

[](#card-deck)

A PHP library for building card decks. Supports standard playing cards, Uno, and any custom card types through extension.

Requirements
------------

[](#requirements)

- PHP 8.1+

Installation
------------

[](#installation)

```
composer require paulemich/card-deck
```

Usage
-----

[](#usage)

### Standard 52-Card Deck

[](#standard-52-card-deck)

```
use PaulEmich\CardDeck\DeckBuilder;

$deck = DeckBuilder::standard()->build();

$card = $deck->draw();
$card->getSuit();  // Suit::Hearts
$card->getRank();  // Rank::Ace
```

### Uno Deck

[](#uno-deck)

```
use PaulEmich\CardDeck\DeckBuilder;

$deck = DeckBuilder::uno()->build();

$card = $deck->draw();
$card->getType();   // UnoCardType::Number
$card->getColor();  // Color::Red
$card->getNumber(); // 5
$card->isWild();    // false
```

### Multiple Decks

[](#multiple-decks)

Use the `times` parameter to multiply a deck:

```
use PaulEmich\CardDeck\DeckBuilder;

// 6-deck shoe for Blackjack (312 cards)
$deck = DeckBuilder::standard(times: 6)->build();
```

### Mixed Decks

[](#mixed-decks)

Combine different deck types with individual multipliers:

```
use PaulEmich\CardDeck\DeckBuilder;
use PaulEmich\CardDeck\Standard\StandardDeckProvider;
use PaulEmich\CardDeck\Uno\UnoDeckProvider;

$deck = (new DeckBuilder())
    ->withDeck(new StandardDeckProvider(), times: 2)
    ->withDeck(new UnoDeckProvider(), times: 1)
    ->build();
```

### Custom Deck Provider

[](#custom-deck-provider)

Implement `DeckProvider` for reusable deck configurations:

```
use PaulEmich\CardDeck\Card;
use PaulEmich\CardDeck\DeckProvider;

class TarotCard extends Card
{
    public function __construct(
        private readonly string $arcana,
        private readonly int $number,
    ) {
        parent::__construct($arcana . '-' . $number);
    }
}

/**
 * @implements DeckProvider
 */
class TarotDeckProvider implements DeckProvider
{
    /** @return TarotCard[] */
    public function getCards(): array
    {
        // Return array of TarotCard
    }
}

$deck = (new DeckBuilder())
    ->withDeck(new TarotDeckProvider(), times: 2)
    ->build();
```

### Shuffling

[](#shuffling)

Use built-in shufflers or create your own:

```
use PaulEmich\CardDeck\DeckBuilder;
use PaulEmich\CardDeck\Shuffler\RandomShuffler;
use PaulEmich\CardDeck\Shuffler\RiffleShuffler;
use PaulEmich\CardDeck\Shuffler\CutShuffler;

$deck = DeckBuilder::standard()
    ->shuffle(new RandomShuffler())
    ->build();
```

**Available shufflers:**

- `RandomShuffler` - Fisher-Yates algorithm (true random)
- `RiffleShuffler` - Splits deck, interleaves halves
- `CutShuffler` - Cuts at random point, swaps halves
- `OverhandShuffler` - Takes chunks from top, reorders

### Shuffle Chains

[](#shuffle-chains)

Combine shufflers and repeat the entire chain:

```
use PaulEmich\CardDeck\Shuffler\ShuffleChain;
use PaulEmich\CardDeck\Shuffler\CutShuffler;
use PaulEmich\CardDeck\Shuffler\RiffleShuffler;

$shuffler = (new ShuffleChain())
    ->then(new CutShuffler())
    ->then(new RiffleShuffler())
    ->then(new CutShuffler())
    ->repeat(10);

$deck = DeckBuilder::standard(times: 6)
    ->shuffle($shuffler)
    ->build();
```

Or use the static factory:

```
$shuffler = ShuffleChain::create([
    new CutShuffler(),
    new RiffleShuffler(),
    new CutShuffler(),
])->repeat(10);
```

### Custom Deck with Closure

[](#custom-deck-with-closure)

```
use PaulEmich\CardDeck\DeckBuilder;
use PaulEmich\CardDeck\Card;

$deck = (new DeckBuilder())
    ->withDeck(function (DeckBuilder $builder) {
        $builder->addCard(new Card('joker-1'));
        $builder->addCard(new Card('joker-2'));
    })
    ->build();
```

Development
-----------

[](#development)

```
# Run tests
composer test

# Run static analysis
composer analyse

# Check code style
composer cs

# Fix code style
composer cs:fix
```

License
-------

[](#license)

MIT

###  Health Score

31

—

LowBetter than 66% of packages

Maintenance81

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

 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

Unknown

Total

1

Last Release

102d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/4c5aba7c688cc3500f3ce2c46de86ed887be5d6a8c6cd3d0c119f090aec4068a?d=identicon)[PaulEmich](/maintainers/PaulEmich)

---

Top Contributors

[![PaulEmich](https://avatars.githubusercontent.com/u/1635879?v=4)](https://github.com/PaulEmich "PaulEmich (8 commits)")

---

Tags

cardgamecardsshuffledeckunoblackjack

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/paulemich-card-deck/health.svg)

```
[![Health](https://phpackages.com/badges/paulemich-card-deck/health.svg)](https://phpackages.com/packages/paulemich-card-deck)
```

###  Alternatives

[digital-creative/resource-navigation-tab

Organize your resource fields into tabs.

78150.5k](/packages/digital-creative-resource-navigation-tab)[ericlagarda/nova-text-card

A custom card for Laravel Nova to show Text in cards with some good options

20406.3k2](/packages/ericlagarda-nova-text-card)[stepanenko3/nova-cards

A Laravel Nova info cards.

33147.6k](/packages/stepanenko3-nova-cards)[digital-creative/resource-navigation-link

Create links to internal or external resources.

1047.4k](/packages/digital-creative-resource-navigation-link)[swooinc/nova-countdown

A countdown card for Laravel Nova.

1224.5k](/packages/swooinc-nova-countdown)

PHPackages © 2026

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