1. Go to this page and download the library: Download ozdemir/subset-finder library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ozdemir / subset-finder example snippets
use Ozdemir\SubsetFinder\Subset;
use Ozdemir\SubsetFinder\SubsetCollection;
use Ozdemir\SubsetFinder\SubsetFinder;
use Ozdemir\SubsetFinder\SubsetFinderConfig;
// Define your collection and subset criteria.
// Any iterable works: a plain array, a generator, or a Laravel collection.
$collection = [
new Product(id: 1, quantity: 11, price: 15),
new Product(id: 2, quantity: 6, price: 5),
new Product(id: 3, quantity: 6, price: 5),
];
$subsetCollection = new SubsetCollection([
Subset::of([1, 2])->take(5), // Each set needs 5 items from products 1 and 2
Subset::of([3])->take(2), // ...and 2 items from product 3
]);
// Allocate the cheapest items first
$config = new SubsetFinderConfig(sortField: 'price');
$subsetFinder = new SubsetFinder($collection, $subsetCollection, $config);
$subsetFinder->solve();
$subsetFinder->getSubsetQuantity(); // 3 — max number of complete sets
$subsetFinder->getFoundSubsets(); // Subsetable[] — id 2 ×6, id 1 ×9, id 3 ×6 (cheapest first)
$subsetFinder->getRemaining(); // Subsetable[] — id 1 ×2 left over
use Ozdemir\SubsetFinder\Subsetable;
class Product implements Subsetable
{
public function __construct(
public int|string $id,
public int $quantity,
public float $price,
) {
}
public function getId(): int|string
{
return $this->id;
}
public function getQuantity(): int
{
return $this->quantity;
}
public function setQuantity(int $quantity): void
{
$this->quantity = $quantity;
}
}
$config = new SubsetFinderConfig(
sortField: 'price', // Property used to order allocation (default: 'id')
sortDescending: false // Ascending = cheapest first (default)
);
use Illuminate\Support\Collection;
use Ozdemir\SubsetFinder\Traits\HasSubsetOperations;
class ProductCollection extends Collection
{
use HasSubsetOperations;
}
$products = new ProductCollection([/* Subsetable items */]);
$subsetFinder = $products->findSubsets($subsetCollection);
$products->canSatisfySubsets($subsetCollection); // bool
$products->getMaxSubsetQuantity($subsetCollection); // int
$subsetFinder->getSubsetItems(10); // First 10 units in sort order
$subsetFinder->isOptimal(); // true if nothing is left over
$subsetFinder->getEfficiencyPercentage(); // Used / total quantity
$subsetFinder->getPerformanceMetrics(); // Timing and counts of the last solve()
use Ozdemir\SubsetFinder\Exceptions\InsufficientQuantityException;
use Ozdemir\SubsetFinder\Exceptions\InvalidArgumentException;
try {
$subsetFinder = new SubsetFinder($collection, $subsetCollection);
$subsetFinder->solve();
} catch (InvalidArgumentException $e) {
// Empty collection, or items not implementing Subsetable
} catch (InsufficientQuantityException $e) {
// Not even one complete set can be built
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.