original_string: 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));
          }
      }
code: 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));
          }
      }
code_tokens: 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 ) ) ; } }
docstring: 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.
docstring_tokens: Recursively process the groups the given member distinguished name belongs to adding them to the already processed groups array .