abmmhasan / game-draw
Generates Item and Item count for winners.
Requires
- php: >=8.0
- ext-bcmath: *
Requires (Dev)
- symfony/var-dumper: ^6.3
README
The Game Draw library provides 2 different way of winner selection based on user's input and selected method.
Please don't use this to generate things/prizes with People's hard-earned money. It is intended to make things fun with bonus gifts only.
Prerequisits
Language: PHP 8/+
PHP Extension: BCMath (may need to install manually)
Installation
composer require abmmhasan/game-draw
Usage (Lucky Draw)
Input Data
$products = [ [ 'item' => 'product_000_NoLuck', // Item code or Identifier 'chances' => '100000', // Item Chances 'amounts'=> [ 1 ] // Item Amounts ], [ 'item' => 'product_001', 'chances' => '1000', 'amounts' => '1.5,10.00001,1' // Weighted CSV formatted range (min,max,bias) ], [ 'item' => 'product_002', 'chances' => '500.001', // Fraction Allowed 'amounts' => [ 1 => 100, // Amount chances 5 => 50, // Format: Amount => Chances 10 => 10.002, // Fraction allowed ] ], [ 'item' => 'product_003', 'chances' => '100', 'amounts' => [ 1 => 100, 5 => 50, 10 => 10, 20 => 5, ] ], [ 'item' => 'product_004', 'chances' => '1', 'amounts' => [ 10, 15, 30, 50 ] // Amounts without probability ], ]
-
item: Provide your item's unique identifier
-
chances: Weight of item (Float/Int).
- It will be compared along all the items in array.
- The higher the chances the greater the chances of getting the item.
- In case of active inventory you can pass available item stock here
-
amounts: String or Array of Item amount (Float/Int). It can be any like:
- (array) Single Positive value, i.e. [ 1 ] or Multiple Positive value (randomly picked), i.e. [ 1, 2, 3, 5]
- (array) Weighted amount, i.e.
[ 5 => 100, 15 => 50, 50 => 10, 80 => 5.001 ]
- (String) Weighted CSV formatted range (min,max,bias)
'1,10.00001,0.001'
- Only 3 members allowed in CSV format min,max,bias
- Max should be greater than or equal to min, bias should be greater than 0
- The higher the bias, the more the chance to pick the lowest amount
Output Data
$luckyDraw = new AbmmHasan\Draw\LuckyDraw($products); $luckyDraw->pick()
Will output the data similar as following,
[ 'item' => 'product_000_NoLuck', // The item name 'amount' => 1 // the selected amount ]
Inventory Solutions
Available stock should be passed (after subtracting used amount from stock amount) in chances properly.
Usage (Grand Draw)
Input Data
$prizes = [ 'product_001'=>50, // Item Code/Identifier => Amount of the item 'product_002'=>5, 'product_003'=>3, 'product_004'=>2, 'product_005'=>1 ];
-
item: Provide your item's unique identifier
-
amounts: Amount of gift. It must be a positive integer value.
To pass users, you've to make a CSV file with at-least 1 column. 1st column will indicate user identity.
"usr47671",
"usr57665",
"usr47671",.....
Output Data
$bucket = new GrandDraw(); // set resources $bucket->setItems([ // set prizes 'product_001' => 10, // Item Code/Identifier => Amount of the item 'product_002' => 5, 'product_003' => 3, 'product_004' => 2, 'product_005' => 1 ])->setUserListFilePath('./Sample1000.csv'); // set the CSV file location // get the winners $bucket->getWinners()
Will provide the output similar as following,
Array ( [product_001] => Array ( [0] => usr47671 [1] => usr57665 [2] => usr92400 [3] => usr7249 [4] => usr37860 [5] => usr57280 [6] => usr97204 [7] => usr82268 [8] => usr16521 [9] => usr24864 ) [product_002] => Array ( [0] => usr50344 [1] => usr60450 [2] => usr62662 [3] => usr26976 [4] => usr56486 ) [product_003] => Array ( [0] => usr92895 [1] => usr37642 [2] => usr85241 ) [product_004] => Array ( [0] => usr84327 [1] => usr22985 ) [product_005] => Array ( [0] => usr26819 ) )
Support
Having trouble? Create an issue!