public function calculateIntersection(ValidatorState $state, array $policies): ValidatorState
    {
        $tree = clone $this;
        $valid_policy_node_set = $tree->_validPolicyNodeSet();
        // 2. If the valid_policy of any node in the valid_policy_node_set
        // is not in the user-initial-policy-set and is not anyPolicy,
        // delete this node and all its children.
        $valid_policy_node_set = array_filter($valid_policy_node_set,
            function (PolicyNode $node) use ($policies) {
                if ($node->isAnyPolicy()) {
                    return true;
                }
                if (in_array($node->validPolicy(), $policies)) {
                    return true;
                }
                $node->remove();
                return false;
            });
        // array of valid policy OIDs
        $valid_policy_set = array_map(
            function (PolicyNode $node) {
                return $node->validPolicy();
            }, $valid_policy_node_set);
        // 3. If the valid_policy_tree includes a node of depth n with
        // the valid_policy anyPolicy and the user-initial-policy-set 
        // is not any-policy
        foreach ($tree->_nodesAtDepth($state->index()) as $node) {
            if ($node->hasParent() && $node->isAnyPolicy()) {
                // a. Set P-Q to the qualifier_set in the node of depth n
                // with valid_policy anyPolicy.
                $pq = $node->qualifiers();
                // b. For each P-OID in the user-initial-policy-set that is not
                // the valid_policy of a node in the valid_policy_node_set,
                // create a child node whose parent is the node of depth n-1
                // with the valid_policy anyPolicy.
                $poids = array_diff($policies, $valid_policy_set);
                foreach ($tree->_nodesAtDepth($state->index() - 1) as $parent) {
                    if ($parent->isAnyPolicy()) {
                        // Set the values in the child node as follows: 
                        // set the valid_policy to P-OID, set the qualifier_set
                        // to P-Q, and set the expected_policy_set to {P-OID}.
                        foreach ($poids as $poid) {
                            $parent->addChild(
                                new PolicyNode($poid, $pq, array($poid)));
                        }
                        break;
                    }
                }
                // c. Delete the node of depth n with the
                // valid_policy anyPolicy.
                $node->remove();
            }
        }
        // 4. If there is a node in the valid_policy_tree of depth n-1 or less
        // without any child nodes, delete that node. Repeat this step until
        // there are no nodes of depth n-1 or less without children.
        if (!$tree->_pruneTree($state->index() - 1)) {
            return $state->withoutValidPolicyTree();
        }
        return $state->withValidPolicyTree($tree);
    }
public function calculateIntersection(ValidatorState $state, array $policies): ValidatorState
    {
        $tree = clone $this;
        $valid_policy_node_set = $tree->_validPolicyNodeSet();
        // 2. If the valid_policy of any node in the valid_policy_node_set
        // is not in the user-initial-policy-set and is not anyPolicy,
        // delete this node and all its children.
        $valid_policy_node_set = array_filter($valid_policy_node_set,
            function (PolicyNode $node) use ($policies) {
                if ($node->isAnyPolicy()) {
                    return true;
                }
                if (in_array($node->validPolicy(), $policies)) {
                    return true;
                }
                $node->remove();
                return false;
            });
        // array of valid policy OIDs
        $valid_policy_set = array_map(
            function (PolicyNode $node) {
                return $node->validPolicy();
            }, $valid_policy_node_set);
        // 3. If the valid_policy_tree includes a node of depth n with
        // the valid_policy anyPolicy and the user-initial-policy-set 
        // is not any-policy
        foreach ($tree->_nodesAtDepth($state->index()) as $node) {
            if ($node->hasParent() && $node->isAnyPolicy()) {
                // a. Set P-Q to the qualifier_set in the node of depth n
                // with valid_policy anyPolicy.
                $pq = $node->qualifiers();
                // b. For each P-OID in the user-initial-policy-set that is not
                // the valid_policy of a node in the valid_policy_node_set,
                // create a child node whose parent is the node of depth n-1
                // with the valid_policy anyPolicy.
                $poids = array_diff($policies, $valid_policy_set);
                foreach ($tree->_nodesAtDepth($state->index() - 1) as $parent) {
                    if ($parent->isAnyPolicy()) {
                        // Set the values in the child node as follows: 
                        // set the valid_policy to P-OID, set the qualifier_set
                        // to P-Q, and set the expected_policy_set to {P-OID}.
                        foreach ($poids as $poid) {
                            $parent->addChild(
                                new PolicyNode($poid, $pq, array($poid)));
                        }
                        break;
                    }
                }
                // c. Delete the node of depth n with the
                // valid_policy anyPolicy.
                $node->remove();
            }
        }
        // 4. If there is a node in the valid_policy_tree of depth n-1 or less
        // without any child nodes, delete that node. Repeat this step until
        // there are no nodes of depth n-1 or less without children.
        if (!$tree->_pruneTree($state->index() - 1)) {
            return $state->withoutValidPolicyTree();
        }
        return $state->withValidPolicyTree($tree);
    }
public function calculateIntersection ( ValidatorState $ state , array $ policies ) : ValidatorState { $ tree = clone $ this ; $ valid_policy_node_set = $ tree -> _validPolicyNodeSet ( ) ; // 2. If the valid_policy of any node in the valid_policy_node_set // is not in the user-initial-policy-set and is not anyPolicy, // delete this node and all its children. $ valid_policy_node_set = array_filter ( $ valid_policy_node_set , function ( PolicyNode $ node ) use ( $ policies ) { if ( $ node -> isAnyPolicy ( ) ) { return true ; } if ( in_array ( $ node -> validPolicy ( ) , $ policies ) ) { return true ; } $ node -> remove ( ) ; return false ; } ) ; // array of valid policy OIDs $ valid_policy_set = array_map ( function ( PolicyNode $ node ) { return $ node -> validPolicy ( ) ; } , $ valid_policy_node_set ) ; // 3. If the valid_policy_tree includes a node of depth n with // the valid_policy anyPolicy and the user-initial-policy-set  // is not any-policy foreach ( $ tree -> _nodesAtDepth ( $ state -> index ( ) ) as $ node ) { if ( $ node -> hasParent ( ) && $ node -> isAnyPolicy ( ) ) { // a. Set P-Q to the qualifier_set in the node of depth n // with valid_policy anyPolicy. $ pq = $ node -> qualifiers ( ) ; // b. For each P-OID in the user-initial-policy-set that is not // the valid_policy of a node in the valid_policy_node_set, // create a child node whose parent is the node of depth n-1 // with the valid_policy anyPolicy. $ poids = array_diff ( $ policies , $ valid_policy_set ) ; foreach ( $ tree -> _nodesAtDepth ( $ state -> index ( ) - 1 ) as $ parent ) { if ( $ parent -> isAnyPolicy ( ) ) { // Set the values in the child node as follows:  // set the valid_policy to P-OID, set the qualifier_set // to P-Q, and set the expected_policy_set to {P-OID}. foreach ( $ poids as $ poid ) { $ parent -> addChild ( new PolicyNode ( $ poid , $ pq , array ( $ poid ) ) ) ; } break ; } } // c. Delete the node of depth n with the // valid_policy anyPolicy. $ node -> remove ( ) ; } } // 4. If there is a node in the valid_policy_tree of depth n-1 or less // without any child nodes, delete that node. Repeat this step until // there are no nodes of depth n-1 or less without children. if ( ! $ tree -> _pruneTree ( $ state -> index ( ) - 1 ) ) { return $ state -> withoutValidPolicyTree ( ) ; } return $ state -> withValidPolicyTree ( $ tree ) ; }
Calculate policy intersection as specified in Wrap-Up Procedure 6.1.5.g.

@param ValidatorState $state
@param array $policies
@return ValidatorState
Calculate policy intersection as specified in Wrap - Up Procedure 6 . 1 . 5 . g .