original_string: public static function pluralize(string $singular)
      {
          $singularRev = strrev($singular);
          $lowerSingularRev = strtolower($singularRev);
          $singularLength = \strlen($lowerSingularRev);
  
          // Check if the word is one which is not inflected, return early if so
          if (\in_array($lowerSingularRev, self::$uninflected, true)) {
              return $singular;
          }
  
          // The outer loop iterates over the entries of the singular table
          // The inner loop $j iterates over the characters of the singular suffix
          // in the singular table to compare them with the characters of the actual
          // given singular suffix
          foreach (self::$singularMap as $map) {
              $suffix = $map[0];
              $suffixLength = $map[1];
              $j = 0;
  
              // Compare characters in the singular table and of the suffix of the
              // given plural one by one
  
              while ($suffix[$j] === $lowerSingularRev[$j]) {
                  // Let $j point to the next character
                  ++$j;
  
                  // Successfully compared the last character
                  // Add an entry with the plural suffix to the plural array
                  if ($j === $suffixLength) {
                      // Is there any character preceding the suffix in the plural string?
                      if ($j < $singularLength) {
                          $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]);
  
                          if (!$map[2] && $nextIsVocal) {
                              // suffix may not succeed a vocal but next char is one
                              break;
                          }
  
                          if (!$map[3] && !$nextIsVocal) {
                              // suffix may not succeed a consonant but next char is one
                              break;
                          }
                      }
  
                      $newBase = substr($singular, 0, $singularLength - $suffixLength);
                      $newSuffix = $map[4];
  
                      // Check whether the first character in the singular suffix
                      // is uppercased. If yes, uppercase the first character in
                      // the singular suffix too
                      $firstUpper = ctype_upper($singularRev[$j - 1]);
  
                      if (\is_array($newSuffix)) {
                          $plurals = [];
  
                          foreach ($newSuffix as $newSuffixEntry) {
                              $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
                          }
  
                          return $plurals;
                      }
  
                      return $newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix);
                  }
  
                  // Suffix is longer than word
                  if ($j === $singularLength) {
                      break;
                  }
              }
          }
  
          // Assume that plural is singular with a trailing `s`
          return $singular.'s';
      }
code: public static function pluralize(string $singular)
      {
          $singularRev = strrev($singular);
          $lowerSingularRev = strtolower($singularRev);
          $singularLength = \strlen($lowerSingularRev);
  
          // Check if the word is one which is not inflected, return early if so
          if (\in_array($lowerSingularRev, self::$uninflected, true)) {
              return $singular;
          }
  
          // The outer loop iterates over the entries of the singular table
          // The inner loop $j iterates over the characters of the singular suffix
          // in the singular table to compare them with the characters of the actual
          // given singular suffix
          foreach (self::$singularMap as $map) {
              $suffix = $map[0];
              $suffixLength = $map[1];
              $j = 0;
  
              // Compare characters in the singular table and of the suffix of the
              // given plural one by one
  
              while ($suffix[$j] === $lowerSingularRev[$j]) {
                  // Let $j point to the next character
                  ++$j;
  
                  // Successfully compared the last character
                  // Add an entry with the plural suffix to the plural array
                  if ($j === $suffixLength) {
                      // Is there any character preceding the suffix in the plural string?
                      if ($j < $singularLength) {
                          $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]);
  
                          if (!$map[2] && $nextIsVocal) {
                              // suffix may not succeed a vocal but next char is one
                              break;
                          }
  
                          if (!$map[3] && !$nextIsVocal) {
                              // suffix may not succeed a consonant but next char is one
                              break;
                          }
                      }
  
                      $newBase = substr($singular, 0, $singularLength - $suffixLength);
                      $newSuffix = $map[4];
  
                      // Check whether the first character in the singular suffix
                      // is uppercased. If yes, uppercase the first character in
                      // the singular suffix too
                      $firstUpper = ctype_upper($singularRev[$j - 1]);
  
                      if (\is_array($newSuffix)) {
                          $plurals = [];
  
                          foreach ($newSuffix as $newSuffixEntry) {
                              $plurals[] = $newBase.($firstUpper ? ucfirst($newSuffixEntry) : $newSuffixEntry);
                          }
  
                          return $plurals;
                      }
  
                      return $newBase.($firstUpper ? ucfirst($newSuffix) : $newSuffix);
                  }
  
                  // Suffix is longer than word
                  if ($j === $singularLength) {
                      break;
                  }
              }
          }
  
          // Assume that plural is singular with a trailing `s`
          return $singular.'s';
      }
code_tokens: public static function pluralize ( string $ singular ) { $ singularRev = strrev ( $ singular ) ; $ lowerSingularRev = strtolower ( $ singularRev ) ; $ singularLength = \ strlen ( $ lowerSingularRev ) ; // Check if the word is one which is not inflected, return early if so if ( \ in_array ( $ lowerSingularRev , self :: $ uninflected , true ) ) { return $ singular ; } // The outer loop iterates over the entries of the singular table // The inner loop $j iterates over the characters of the singular suffix // in the singular table to compare them with the characters of the actual // given singular suffix foreach ( self :: $ singularMap as $ map ) { $ suffix = $ map [ 0 ] ; $ suffixLength = $ map [ 1 ] ; $ j = 0 ; // Compare characters in the singular table and of the suffix of the // given plural one by one while ( $ suffix [ $ j ] === $ lowerSingularRev [ $ j ] ) { // Let $j point to the next character ++ $ j ; // Successfully compared the last character // Add an entry with the plural suffix to the plural array if ( $ j === $ suffixLength ) { // Is there any character preceding the suffix in the plural string? if ( $ j < $ singularLength ) { $ nextIsVocal = false !== strpos ( 'aeiou' , $ lowerSingularRev [ $ j ] ) ; if ( ! $ map [ 2 ] && $ nextIsVocal ) { // suffix may not succeed a vocal but next char is one break ; } if ( ! $ map [ 3 ] && ! $ nextIsVocal ) { // suffix may not succeed a consonant but next char is one break ; } } $ newBase = substr ( $ singular , 0 , $ singularLength - $ suffixLength ) ; $ newSuffix = $ map [ 4 ] ; // Check whether the first character in the singular suffix // is uppercased. If yes, uppercase the first character in // the singular suffix too $ firstUpper = ctype_upper ( $ singularRev [ $ j - 1 ] ) ; if ( \ is_array ( $ newSuffix ) ) { $ plurals = [ ] ; foreach ( $ newSuffix as $ newSuffixEntry ) { $ plurals [ ] = $ newBase . ( $ firstUpper ? ucfirst ( $ newSuffixEntry ) : $ newSuffixEntry ) ; } return $ plurals ; } return $ newBase . ( $ firstUpper ? ucfirst ( $ newSuffix ) : $ newSuffix ) ; } // Suffix is longer than word if ( $ j === $ singularLength ) { break ; } } } // Assume that plural is singular with a trailing `s` return $ singular . 's' ; }
docstring: Returns the plural form of a word.
  
  If the method can't determine the form with certainty, an array of the
  possible plurals is returned.
  
  @param string $singular A word in plural form
  
  @return string|array The plural form or an array of possible plural forms
docstring_tokens: Returns the plural form of a word .