protected function ldap_find_user_groups_recursively($memberdn, &$membergroups) {
        $result = @ldap_read($this->ldapconnection, $memberdn, '(objectClass=*)', array($this->get_config('group_memberofattribute')));
        if (!$result) {
            return;
        }

        if ($entry = ldap_first_entry($this->ldapconnection, $result)) {
            do {
                $attributes = ldap_get_attributes($this->ldapconnection, $entry);
                for ($j = 0; $j < $attributes['count']; $j++) {
                    $groups = ldap_get_values_len($this->ldapconnection, $entry, $attributes[$j]);
                    foreach ($groups as $key => $group) {
                        if ($key === 'count') {  // Skip the entries count
                            continue;
                        }
                        if(!in_array($group, $membergroups)) {
                            // Only push and recurse if we haven't 'seen' this group before
                            // to prevent loops (MS Active Directory allows them!!).
                            array_push($membergroups, $group);
                            $this->ldap_find_user_groups_recursively($group, $membergroups);
                        }
                    }
                }
            }
            while ($entry = ldap_next_entry($this->ldapconnection, $entry));
        }
    }
protected function ldap_find_user_groups_recursively($memberdn, &$membergroups) {
        $result = @ldap_read($this->ldapconnection, $memberdn, '(objectClass=*)', array($this->get_config('group_memberofattribute')));
        if (!$result) {
            return;
        }

        if ($entry = ldap_first_entry($this->ldapconnection, $result)) {
            do {
                $attributes = ldap_get_attributes($this->ldapconnection, $entry);
                for ($j = 0; $j < $attributes['count']; $j++) {
                    $groups = ldap_get_values_len($this->ldapconnection, $entry, $attributes[$j]);
                    foreach ($groups as $key => $group) {
                        if ($key === 'count') {  // Skip the entries count
                            continue;
                        }
                        if(!in_array($group, $membergroups)) {
                            // Only push and recurse if we haven't 'seen' this group before
                            // to prevent loops (MS Active Directory allows them!!).
                            array_push($membergroups, $group);
                            $this->ldap_find_user_groups_recursively($group, $membergroups);
                        }
                    }
                }
            }
            while ($entry = ldap_next_entry($this->ldapconnection, $entry));
        }
    }
protected function ldap_find_user_groups_recursively ( $ memberdn , & $ membergroups ) { $ result = @ ldap_read ( $ this -> ldapconnection , $ memberdn , '(objectClass=*)' , array ( $ this -> get_config ( 'group_memberofattribute' ) ) ) ; if ( ! $ result ) { return ; } if ( $ entry = ldap_first_entry ( $ this -> ldapconnection , $ result ) ) { do { $ attributes = ldap_get_attributes ( $ this -> ldapconnection , $ entry ) ; for ( $ j = 0 ; $ j < $ attributes [ 'count' ] ; $ j ++ ) { $ groups = ldap_get_values_len ( $ this -> ldapconnection , $ entry , $ attributes [ $ j ] ) ; foreach ( $ groups as $ key => $ group ) { if ( $ key === 'count' ) { // Skip the entries count continue ; } if ( ! in_array ( $ group , $ membergroups ) ) { // Only push and recurse if we haven't 'seen' this group before // to prevent loops (MS Active Directory allows them!!). array_push ( $ membergroups , $ group ) ; $ this -> ldap_find_user_groups_recursively ( $ group , $ membergroups ) ; } } } } while ( $ entry = ldap_next_entry ( $ this -> ldapconnection , $ entry ) ) ; } }
Recursively process the groups the given member distinguished name
belongs to, adding them to the already processed groups array.

@param string $memberdn distinguished name to search
@param array reference &$membergroups array with already found
groups, where we'll put the newly found
groups.
Recursively process the groups the given member distinguished name belongs to adding them to the already processed groups array .