drupol/phpartition

Partition problem for balanced arrays splitting made easy.

Maintainers

👁 drupol

Package info

github.com/drupol/phpartition

pkg:composer/drupol/phpartition

Fund package maintenance!

drupol

Statistics

Installs: 4 486

Dependents: 1

Suggesters: 0

Stars: 9

Open Issues: 1

0.1.2 2017-01-15 22:37 UTC

Suggests

None

Provides

None

Conflicts

None

Replaces

None

GPL-2.0+ ac5162d8d4f9328d35c2279ff350258f6cbbdbf2

  • Pol Dellaiera <pol.dellaiera.woop@protonmail.com>

mathnumbersstatisticsPartitiongreedykarmarkarkarp

This package is auto-updated.

Last update: 2026-06-11 23:54:50 UTC


README

👁 Build Status
👁 Code Coverage
👁 Scrutinizer Code Quality
👁 Dependency Status

In number theory and computer science, the partition problem is the task of deciding whether a given multiset of items can be partitioned into multiple balanced subsets.

Requirements

  • PHP >= 5.6,
  • (optional) PHPUnit to run tests.

Examples

<?php

include "./vendor/autoload.php";

$data = array(1, 5, 5, 11, 6, 7, 9, 3);

$greedy = new \drupol\phpartition\Algorithm\Greedy();
$greedy->setData($data);
$greedy->setSize(3);
$result = $greedy->getResult();

// $result is:
/*
 * Array
 (
 [0] => Array
 (
 [0] => 9
 [1] => 5
 [2] => 1
 )

 [1] => Array
 (
 [0] => 7
 [1] => 6
 [2] => 3
 )

 [2] => Array
 (
 [0] => 11
 [1] => 5
 )
 )
 */

$simple = new \drupol\phpartition\Algorithm\Simple();
$simple->setData($data);
$simple->setSize(3);
$result = $simple->getResult();

// $result is:
/*
 * Array
(
 [0] => Array
 (
 [0] => 5
 [1] => 11
 )

 [1] => Array
 (
 [0] => 1
 [1] => 7
 [2] => 3
 )

 [2] => Array
 (
 [0] => 5
 [1] => 6
 [2] => 9
 )
)
 */

You may also pass objects or array but then, you'll have to define how to access their value.

<?php

include "./vendor/autoload.php";

$data = array(
 array(
 'item' => 'anything A',
 'weight' => 1,
 ),
 array(
 'item' => 'anything B',
 'weight' => 2,
 ),
 array(
 'item' => 'anything C',
 'weight' => 3,
 ),
 array(
 'item' => 'anything D',
 'weight' => 4,
 ),
);

$greedy = new \drupol\phpartition\Algorithm\Greedy();
$greedy->setData($data);
$greedy->setSize(2);
$greedy->setItemAccessCallback(function($item) {
 return $item['weight'];
});
$result = $greedy->getResult();

// $result is
/*
 * Array
 (
 [0] => Array
 (
 [0] => Array
 (
 [item] => anything C
 [weight] => 3
 )

 [1] => Array
 (
 [item] => anything B
 [weight] => 2
 )

 )

 [1] => Array
 (
 [0] => Array
 (
 [item] => anything D
 [weight] => 4
 )

 [1] => Array
 (
 [item] => anything A
 [weight] => 1
 )

 )

 )
 */

It's also possible to mix the type of object to partition.

TODO

  • Implement Complete Karmarkar-Karp (CKK) algorithm,
  • Documentation.