Download 
 
 
  
Tree Classifier
A PHP Library for decision trees 
What is a decision tree?
This (really basic):   
Code Example
In this example we classify 10 Persons. We want to find all males under 50 years old who can cook and don't playing football <?php
use Devtronic\TreeClassifier\DecisionNode;
use Devtronic\TreeClassifier\RootNode;
use Devtronic\TreeClassifier\TerminalNode;
require_once 'vendor/autoload.php';
$subjects = [
    0 => ['gender' => 'male',   'age' => 41, 'playsFootball' => 'nope', 'canCook' => 'nope'],
    1 => ['gender' => 'female', 'age' => 91, 'playsFootball' => 'nope', 'canCook' => 'nope'],
    2 => ['gender' => 'male',   'age' => 17, 'playsFootball' => 'nope', 'canCook' => 'yes'],
    3 => ['gender' => 'female', 'age' => 39, 'playsFootball' => 'nope', 'canCook' => 'yes'],
    4 => ['gender' => 'male',   'age' => 90, 'playsFootball' => 'nope', 'canCook' => 'yes'],
    5 => ['gender' => 'male',   'age' => 51, 'playsFootball' => 'nope', 'canCook' => 'yes'],
    6 => ['gender' => 'male',   'age' => 86, 'playsFootball' => 'yes',  'canCook' => 'nope'],
    7 => ['gender' => 'male',   'age' => 99, 'playsFootball' => 'yes',  'canCook' => 'yes'],
    8 => ['gender' => 'female', 'age' => 39, 'playsFootball' => 'nope', 'canCook' => 'yes'],
    9 => ['gender' => 'female', 'age' => 37, 'playsFootball' => 'yes',  'canCook' => 'yes'],
];
// Find all
// - males
// - under 50
// - can cook
// - does not play football
// Create from bottom up
// We want all subjects who don't play football
$footballDecisions = [
    'play' => new TerminalNode(),
    'does not play' => new TerminalNode(), // This is our last node
];
// Create the decider for football
$footballDecider = new DecisionNode(function ($subject) {
    // This is our decider function, $subject is the current object
    // in the queue of the current node.
    // Return the key of our $footballDecision-Array
    return ($subject['playsFootball'] == 'yes' ? 'play' : 'does not play');
}, $footballDecisions);
// Great, next we need the cook-decisions.
$cookDecisions = [
    'can cook' => $footballDecider, // redirect all subjects who can cook to the $footballDecider
    'can not cook' => new TerminalNode(),
];
// Now the cookDecider
$cookDecider = new DecisionNode(function ($subject) {
    return ($subject['canCook'] == 'yes' ? 'can cook' : 'can not cook');
}, $cookDecisions);
// The same as previous for the next 2 decisions
$ageDecisions = [
    '< 50' => $cookDecider,
    '>= 50' => new TerminalNode(),
];
$ageDecider = new DecisionNode(function ($subject) {
    return ($subject['age'] >= 50 ? '>= 50' : '< 50');
}, $ageDecisions);
$genderDecisions = [
    'male' => $ageDecider,
    'female' => new TerminalNode(),
];
$genderDecider = new DecisionNode(function ($subject) {
    return $subject['gender'];
}, $genderDecisions);
// And now we need to create a RootNode
$rootNode = new RootNode($subjects);
// Add the first (last created) node to our RootNode:
$rootNode->addSubNode($genderDecider);
// And classify
$rootNode->classify();
// In $footballDecisions['does not play'] are our subjects there we looked for:
print_r($footballDecisions['does not play']);
// Outputs
// Array
// (
//     [0] => Array
//         (
//             [gender] => male
//             [age] => 17
//             [playsFootball] => nope
//             [canCook] => yes
//         )
//   )
// Explanation:
//                 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] = Keys from $subjects-Array
//                 \_________ RootNode _________/
//                                |
//                 /------ Gender Decider ------\
//                 |                            |
//               Female                        Male
//            [1, 3, 8, 9]             [0, 2, 4, 5, 6, 7]
//                 |                            |
//           Terminal Node                      |
//                                  /-----  Age Decider -----\
//                                  |                        |
//                               >= 50                      < 50
//                            [4, 5, 6, 7]                 [0, 2]
//                                  |                        |
//                            Terminal Node                  |
//                                                /---- Cook Decider ----\
//                                                |                      |
//                                           Can not cook            Can cook
//                                               [0]                    [2]
//                                                |                      |
//                                           Terminal Node               |
//                                                           /---- Football Decider ----\
//                                                           |                          |
//                                                         play                   does not play
//                                                          [ ]                        [2]
//                                                           |                          |
//                                                     Terminal Node              Terminal Node
  |