Last active
July 5, 2019 01:03
-
-
Save theodorejb/ba35fc8f72df8823e07c5f3b51870e00 to your computer and use it in GitHub Desktop.
Analysis of curly brace array syntax usage in top PHP packages
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| // parse the output of https://gist.github.com/nikic/b5f811e0423bf051f4492cd6e0c0273e | |
| $contents = file('alternative_array_syntax_usage.txt'); | |
| $match = '/home/nikic/package-analysis/sources/'; | |
| $matchLen = strlen($match); | |
| $parseErrorMatch = 'Parse error:'; | |
| $parseErrorLen = strlen($parseErrorMatch); | |
| $uniqueNamespaces = $uniquePkgs = $uniqueVars = []; | |
| $totalCount = 0; | |
| $lastLine = null; | |
| $checkLine = function (string $line) use ($matchLen, $match, &$totalCount, &$uniqueNamespaces, &$uniquePkgs, &$uniqueVars) { | |
| if (substr($line, 0, $matchLen) === $match) { | |
| $rest = substr($line, $matchLen); | |
| $pkgSlash = strpos($rest, '/', 1); | |
| $srcSlash = strpos($rest, '/', $pkgSlash + 1); | |
| $namespace = substr($rest, 0, $pkgSlash); | |
| $package = substr($rest, $pkgSlash + 1, $srcSlash - $pkgSlash - 1); | |
| $packageFullname = $namespace . '/' . $package; | |
| $totalCount++; | |
| if (!isset($uniqueNamespaces[$namespace])) { | |
| $uniqueNamespaces[$namespace] = 1; | |
| } else { | |
| $uniqueNamespaces[$namespace] += 1; | |
| } | |
| if (!isset($uniquePkgs[$packageFullname])) { | |
| $uniquePkgs[$packageFullname] = 1; | |
| } else { | |
| $uniquePkgs[$packageFullname] += 1; | |
| } | |
| } else { | |
| $curlyPos = strpos($line, '{'); | |
| if ($curlyPos !== false) { | |
| $var = trim(substr($line, 0, $curlyPos)); | |
| if (!isset($uniqueVars[$var])) { | |
| $uniqueVars[$var] = 1; | |
| } else { | |
| $uniqueVars[$var] += 1; | |
| } | |
| } | |
| } | |
| }; | |
| foreach($contents as $line) { | |
| if (substr($line, 0, $parseErrorLen) === $parseErrorMatch) { | |
| $lastLine = null; | |
| continue; | |
| } | |
| if ($lastLine !== null) { | |
| $checkLine($lastLine); | |
| } | |
| $lastLine = $line; | |
| } | |
| if ($lastLine !== null) { | |
| $checkLine($lastLine); | |
| } | |
| echo count($uniqueNamespaces) . ' namespaces with curly brace uses' . PHP_EOL; | |
| echo count($uniquePkgs) . ' packages with curly brace uses' . PHP_EOL; | |
| echo 'Total uses in top 2K packages: ' . $totalCount . PHP_EOL; | |
| arsort($uniquePkgs); | |
| $top15 = $top25 = $twoOrLess = $fourOrLess = 0; | |
| $i = 0; | |
| foreach ($uniquePkgs as $key => $val) { | |
| if ($key !== 'johnpbloch/wordpress-core' && $key !== 'tecnick.com/tcpdf') { | |
| // don't count duplicate projects | |
| $i++; | |
| } | |
| if ($i <= 15) { | |
| $top15 += $val; | |
| } | |
| if ($i <= 25) { | |
| $top25 += $val; | |
| } | |
| if ($val <= 4) { | |
| $fourOrLess++; | |
| } | |
| if ($val <= 2) { | |
| $twoOrLess++; | |
| } | |
| } | |
| echo $top15 . ' uses in 15 unique projects' . PHP_EOL; | |
| echo $top25 . ' uses in 25 unique projects' . PHP_EOL; | |
| echo $fourOrLess . ' projects have 4 or fewer usages' . PHP_EOL; | |
| echo $twoOrLess . ' projects only have 1 or 2 usages' . PHP_EOL; | |
| echo PHP_EOL; | |
| var_export($uniquePkgs); | |
| echo PHP_EOL . PHP_EOL; | |
| arsort($uniqueVars); | |
| echo count($uniqueVars) . ' unique variables:' . PHP_EOL; | |
| var_export($uniqueVars); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 75 namespaces with curly brace uses | |
| 89 packages with curly brace uses | |
| Total uses in top 2K packages: 2217 | |
| 1828 uses in 15 unique projects | |
| 2036 uses in 25 unique projects | |
| 53 projects have 4 or fewer usages | |
| 37 projects only have 1 or 2 usages | |
| array ( | |
| 'james-heinrich/getid3' => 299, | |
| 'mpdf/mpdf' => 231, | |
| 'phpoffice/phpexcel' => 219, | |
| 'roots/wordpress' => 182, | |
| 'johnpbloch/wordpress-core' => 182, | |
| 'milon/barcode' => 89, | |
| 'lukasreschke/id3parser' => 78, | |
| 'tecnickcom/tcpdf' => 74, | |
| 'tecnick.com/tcpdf' => 74, | |
| 'yiisoft/yii' => 64, | |
| 'picqer/php-barcode-generator' => 63, | |
| 'squizlabs/php_codesniffer' => 56, | |
| 'pear/pear' => 55, | |
| 'phing/phing' => 46, | |
| 'campaignmonitor/createsend-php' => 40, | |
| 'georgringer/news' => 38, | |
| 'behat/transliterator' => 38, | |
| 'lsolesen/pel' => 37, | |
| 'zendframework/zendframework1' => 37, | |
| 'dflydev/markdown' => 22, | |
| 'michelf/php-markdown' => 21, | |
| 'magento/zendframework1' => 18, | |
| 'adoy/fastcgi-client' => 17, | |
| 'phphleb/framework' => 14, | |
| 'phphleb/hleb' => 14, | |
| 'parsecsv/php-parsecsv' => 14, | |
| 'zendframework/zend-json' => 14, | |
| 'typo3/cms' => 12, | |
| 'typo3/cms-core' => 12, | |
| 'pear/console_getopt' => 11, | |
| 'zendframework/zend-barcode' => 9, | |
| 'mso/idna-convert' => 7, | |
| 'braintree/braintree_php' => 6, | |
| 'cakephp/cakephp' => 6, | |
| 'typo3fluid/fluid' => 6, | |
| 'leafo/lessphp' => 5, | |
| 'ezyang/htmlpurifier' => 4, | |
| 'greenlion/php-sql-parser' => 4, | |
| 'ronanguilloux/isocodes' => 4, | |
| 'simplepie/simplepie' => 4, | |
| 'zendframework/zend-code' => 4, | |
| 'amazonwebservices/aws-sdk-for-php' => 4, | |
| 'neitanod/forceutf8' => 4, | |
| 'globalcitizen/php-iban' => 3, | |
| 'khanamiryan/qrcode-detector-decoder' => 3, | |
| 'codeigniter/framework' => 3, | |
| 'drupal/core' => 3, | |
| 'ulrichsg/getopt-php' => 3, | |
| 'zendframework/zend-validator' => 3, | |
| 'teamtnt/tntsearch' => 3, | |
| 'electrolinux/phpquery' => 3, | |
| 'propel/propel' => 3, | |
| 'apache/thrift' => 2, | |
| 'mikey179/vfsstream' => 2, | |
| 'phpdocumentor/phpdocumentor' => 2, | |
| 'abraham/twitteroauth' => 2, | |
| 'acquia/lightning' => 2, | |
| 'inacho/php-credit-card-validator' => 2, | |
| 'cakephp/cakephp-codesniffer' => 2, | |
| 'packaged/thrift' => 2, | |
| 'windwalker/structure' => 2, | |
| 'hybridauth/hybridauth' => 2, | |
| 'zendframework/zend-view' => 2, | |
| 'theorchard/monolog-cascade' => 2, | |
| 'pear/pear-core-minimal' => 2, | |
| 'fzaninotto/faker' => 2, | |
| 'xamin/handlebars.php' => 2, | |
| 'helios-ag/fm-elfinder-php-connector' => 1, | |
| 'snc/redis-bundle' => 1, | |
| 'jakub-onderka/php-parallel-lint' => 1, | |
| 'mrclay/minify' => 1, | |
| 'besimple/soap-client' => 1, | |
| 'netresearch/jsonmapper' => 1, | |
| 'pear/xml_util' => 1, | |
| 'typo3/phar-stream-wrapper' => 1, | |
| 'magento/magento2-functional-testing-framework' => 1, | |
| 'adodb/adodb-php' => 1, | |
| 'icanboogie/inflector' => 1, | |
| 'fileeye/mimemap' => 1, | |
| 'icecave/repr' => 1, | |
| 'akamai-open/edgegrid-client' => 1, | |
| 'mk-j/php_xlsxwriter' => 1, | |
| 'piwik/piwik-php-tracker' => 1, | |
| 'silverstripe/framework' => 1, | |
| 'fluidtypo3/vhs' => 1, | |
| 'cakephp/plugin-installer' => 1, | |
| 'studio-42/elfinder' => 1, | |
| 'topthink/framework' => 1, | |
| 'mayflower/php-codebrowser' => 1, | |
| ) | |
| 249 unique variables: | |
| array ( | |
| '$string' => 239, | |
| '$code' => 197, | |
| '$c' => 171, | |
| '$col' => 75, | |
| '$var' => 72, | |
| '$Bytestring' => 64, | |
| '$data' => 59, | |
| '$chrs' => 54, | |
| '$Header4Bytes' => 48, | |
| '$seq' => 44, | |
| '$value' => 44, | |
| '$recordData' => 42, | |
| '$utf8' => 42, | |
| '$tag' => 39, | |
| '$this->formula' => 35, | |
| '$SyncPattern1' => 32, | |
| '$text' => 27, | |
| '$str' => 27, | |
| '$header' => 26, | |
| '$xclrValue' => 24, | |
| '$hex' => 20, | |
| '$seq[1]' => 17, | |
| '$numberstring' => 16, | |
| '$token' => 16, | |
| '$binarypointnumber' => 15, | |
| '$byteword' => 15, | |
| '$formula' => 15, | |
| '$bytes' => 14, | |
| '$pair' => 13, | |
| '$path' => 13, | |
| '$footer' => 12, | |
| '$utf16' => 12, | |
| '$bit' => 12, | |
| '$url' => 11, | |
| '$name' => 11, | |
| '$input' => 11, | |
| '$BMPpixelData' => 10, | |
| '$pString' => 10, | |
| '$ts[\'col\']' => 10, | |
| '$col1' => 10, | |
| '$bitword' => 9, | |
| '$asciidata' => 9, | |
| '$chr[$char]' => 9, | |
| '$colour' => 9, | |
| '$dict' => 8, | |
| '$stops[$i][\'col\']' => 8, | |
| '$arg' => 8, | |
| '$encoded' => 8, | |
| '$frame_name' => 8, | |
| '$lucifer[0]' => 8, | |
| '$pb[\'col\']' => 8, | |
| '$strPath' => 8, | |
| '$hash' => 8, | |
| '$id3v1tag' => 8, | |
| '$framedata' => 8, | |
| '$parsedFrame[\'frame_name\']' => 8, | |
| '$this->pdfdata' => 8, | |
| '$utf8text' => 7, | |
| '$line' => 7, | |
| '$ISOtime' => 7, | |
| '$chars' => 6, | |
| '$tokens[$stackPtr][\'content\']' => 6, | |
| '$head4' => 6, | |
| '$dom[$key][\'value\']' => 6, | |
| '$buffer_4k' => 6, | |
| '$version' => 6, | |
| '$this->bytes' => 5, | |
| '$rowDatum' => 5, | |
| '$firstBit' => 5, | |
| '$sh[\'col\']' => 5, | |
| '$key' => 5, | |
| '$METAeventData' => 5, | |
| '$p' => 5, | |
| '$buffer' => 5, | |
| '$raw' => 4, | |
| '$attr[\'size\']' => 4, | |
| '$generate_url' => 4, | |
| '$complexNumber' => 4, | |
| '$filename' => 4, | |
| '$LAMEtocData' => 4, | |
| '$binstring' => 4, | |
| '$functionName' => 4, | |
| '$ThisWord' => 4, | |
| '$this->bodyBackgroundColor' => 4, | |
| '$isbn13' => 4, | |
| '$package[\'platform\'][$file]' => 4, | |
| '$ent' => 4, | |
| '$dir' => 4, | |
| '$base' => 4, | |
| '$number' => 4, | |
| '$PCD_data_Cr' => 4, | |
| '$PCD_data_Cb' => 4, | |
| '$wavpackheader' => 4, | |
| '$chr[$char_space]' => 4, | |
| '$slug' => 4, | |
| '$upce_code' => 4, | |
| '$uri' => 4, | |
| '$details[$side][\'c\']' => 4, | |
| '$chr[$char_bar]' => 4, | |
| '$frame_remainingdata' => 4, | |
| '$entry' => 4, | |
| '$href' => 4, | |
| '$rgb' => 3, | |
| '$bban' => 3, | |
| '$formulaData' => 3, | |
| '$cor' => 3, | |
| '$this->_compile_' => 3, | |
| '$ttaheader' => 3, | |
| '$matches[3]' => 3, | |
| '$Pattern' => 3, | |
| '$pathname' => 3, | |
| '$variable' => 3, | |
| '$argsString' => 3, | |
| '$original_text' => 3, | |
| '$comment' => 3, | |
| '$function' => 3, | |
| '$method' => 3, | |
| '$next4' => 3, | |
| '$fourbit' => 3, | |
| '$majver' => 3, | |
| '$matches[2]' => 3, | |
| '$element' => 2, | |
| '$trackingNumber' => 2, | |
| '$root' => 2, | |
| '$versioncomponents[2]' => 2, | |
| '$opt[1]' => 2, | |
| '$transparency' => 2, | |
| '$outerPad' => 2, | |
| '$spec' => 2, | |
| '$tracking_number' => 2, | |
| '$keyDigest' => 2, | |
| '$innerPad' => 2, | |
| '$result' => 2, | |
| '$this->buffer' => 2, | |
| '$signature' => 2, | |
| '$built' => 2, | |
| '$methodName' => 2, | |
| '$memberName' => 2, | |
| '$hs' => 2, | |
| '$PCD_data_Y1' => 2, | |
| '$platform' => 2, | |
| '$currName' => 2, | |
| 'static::$validationKeys' => 2, | |
| '$hetu' => 2, | |
| '$t' => 2, | |
| '$sb' => 2, | |
| '$match[1]' => 2, | |
| '$tmp' => 2, | |
| '$argument' => 2, | |
| '$match[2]' => 2, | |
| '$contentLines[$contentLineIndex + 1]' => 2, | |
| '$file[\'attribs\'][\'name\']' => 2, | |
| '$isbn10' => 2, | |
| '$quotedValue' => 2, | |
| '$DirectoryRecordData' => 2, | |
| '$hdr_data' => 2, | |
| '$prepend' => 2, | |
| '$PCD_data_Y2' => 2, | |
| '$attrib' => 2, | |
| '$matches[1]' => 2, | |
| '$all' => 2, | |
| '$args[0]' => 2, | |
| '$part' => 2, | |
| '$_hl_excluded_key' => 2, | |
| '$secret_key' => 2, | |
| '$workString' => 2, | |
| '$operand' => 2, | |
| '$time' => 2, | |
| '$rowReference' => 2, | |
| '$columnReference' => 2, | |
| '$condition' => 2, | |
| '$tValue' => 2, | |
| '$stroke' => 2, | |
| '$styleSettings' => 2, | |
| '$hl_val_address' => 2, | |
| '$dynamicRuleType' => 2, | |
| '$subData' => 2, | |
| '$matches[0]' => 2, | |
| '$token[\'content\']' => 2, | |
| '$content' => 2, | |
| '$this->_stream' => 1, | |
| '$deletefilemessage' => 1, | |
| '$ArrayPath' => 1, | |
| '$formulaStructure' => 1, | |
| '$atts[\'platform\']' => 1, | |
| '$BlockData' => 1, | |
| '$bar' => 1, | |
| '$ISOheader' => 1, | |
| '$options[\'percent_pad\']' => 1, | |
| '$check' => 1, | |
| '$md5' => 1, | |
| '$type' => 1, | |
| '$ActualFilenameNoExt' => 1, | |
| '$email' => 1, | |
| '$classname' => 1, | |
| '$resp[\'content\']' => 1, | |
| '$child' => 1, | |
| '$domain' => 1, | |
| '$strPathname' => 1, | |
| '$drive' => 1, | |
| '$d' => 1, | |
| '$characters' => 1, | |
| '$PatternFilenameNoExt' => 1, | |
| '$param[\'comment\']' => 1, | |
| '$subPathName' => 1, | |
| '$caption' => 1, | |
| '$tags' => 1, | |
| '$relative' => 1, | |
| '$rule' => 1, | |
| '$newColumn' => 1, | |
| '$max' => 1, | |
| '$param' => 1, | |
| '$beforeColumn' => 1, | |
| '$stringRepresentation' => 1, | |
| '$lpData' => 1, | |
| '$this->data' => 1, | |
| '$operand1' => 1, | |
| '$operand2' => 1, | |
| '$pValue' => 1, | |
| '$package[\'version\']' => 1, | |
| '$subProp[1]' => 1, | |
| '$this->_version' => 1, | |
| '$col_ref' => 1, | |
| '$sql' => 1, | |
| '$funcName' => 1, | |
| '$camelCapsPart' => 1, | |
| '$opt' => 1, | |
| '$xmlFile' => 1, | |
| '$next_option_rest' => 1, | |
| '$wsTitle' => 1, | |
| '$depdb[\'_version\']' => 1, | |
| '$newRow' => 1, | |
| '$this->encryptionKey' => 1, | |
| '$beforeRow' => 1, | |
| '$TagHeaderTest' => 1, | |
| '$metablockheader' => 1, | |
| '$os' => 1, | |
| '$mode' => 1, | |
| '$options[\'fraction_pad\']' => 1, | |
| '$owner_rc4_key' => 1, | |
| '$cOTLdata[$c][\'group\']' => 1, | |
| '$file' => 1, | |
| '$components[\'path\']' => 1, | |
| '$cOTLdata[$nc][\'group\']' => 1, | |
| '$chunkOTLdata[\'group\']' => 1, | |
| '$params[1]' => 1, | |
| '$info[\'arg\']' => 1, | |
| '$OTLdata[\'group\']' => 1, | |
| '$ascii' => 1, | |
| ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment