{"id":21838253,"url":"https://github.com/vielhuber/stringhelper","last_synced_at":"2025-04-14T10:22:01.090Z","repository":{"id":50022706,"uuid":"61498558","full_name":"vielhuber/stringhelper","owner":"vielhuber","description":"⛏️ Collection of string related functions in php. ⛏️","archived":false,"fork":false,"pushed_at":"2025-04-09T11:57:43.000Z","size":11150,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-14T06:16:11.425Z","etag":null,"topics":["php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vielhuber.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-19T20:17:53.000Z","updated_at":"2025-04-09T11:57:39.000Z","dependencies_parsed_at":"2024-06-24T10:42:29.012Z","dependency_job_id":"b18c4d7e-838f-4ae7-9a0f-f0d8b0a99d42","html_url":"https://github.com/vielhuber/stringhelper","commit_stats":{"total_commits":613,"total_committers":1,"mean_commits":613.0,"dds":0.0,"last_synced_commit":"299036678fba4bc458ca998a42c6d20b684f81d7"},"previous_names":[],"tags_count":549,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vielhuber%2Fstringhelper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vielhuber%2Fstringhelper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vielhuber%2Fstringhelper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vielhuber%2Fstringhelper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vielhuber","download_url":"https://codeload.github.com/vielhuber/stringhelper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248830422,"owners_count":21168275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php"],"created_at":"2024-11-27T21:09:31.249Z","updated_at":"2025-04-14T10:22:01.074Z","avatar_url":"https://github.com/vielhuber.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![build status](https://github.com/vielhuber/stringhelper/actions/workflows/ci.yml/badge.svg)](https://github.com/vielhuber/stringhelper/actions)\n\n# ⛏️ stringhelper ⛏️\n\n## motivation\n\nthis package is a collection of various helpers for string manipulation, validation, and utility functions designed to simplify the life of php developers. it streamlines tasks like checking variable existence, comparing values, and handling dates, urls, and emails. this tool enhances efficiency by offering concise, reusable methods for everyday coding challenges.\n\n## installation\n\n```\ncomposer require vielhuber/stringhelper\n```\n\n## usage\n\n### existence\n\n```php\n// check existence\nif (__x($var)) {\n}\nif (__x(@$var)) {\n}\n\n// check non-existence\nif (__nx($var)) {\n}\nif (__nx(@$var)) {\n}\n\n// check existence (without stfu-operator)\nif (__rx($var)) {\n}\nif (__fx(fn() =\u003e $var)) {\n}\n\n// check non-existence (without stfu-operator)\nif (__rnx($var)) {\n}\nif (__fnx(fn() =\u003e $var)) {\n}\n```\n\n### equality\n\n```php\n// php has a lot of pitfalls, when comparing loosely\nif( 0 == 'true' ) // true\nif( 0 == 'str' ) // true\nif( 'null' == null ) // false\nif( '0' == null ) // false\nif( '0' == true ) // false\nif( '0' == false ) // true\nif( 'false' == true ) // true\nif( 'false' == false ) // false\nif( new stdClass == true ) // true\nif( [] == false ) // true\nif( [] == null ) // true\nif( [''] == [] ) // false\nif( [''] == [0] ) // true\nif( 0 == '' ) // true\nif( 0 == ' ' ) // true\nif( -1 == true ) // true\nif( '-1' == true ) // true\n\n// this non-strict equality is symmetric, but not transitive\n$a = ''; $b = 0; $c = 'oh';\n$a == $b; // true\n$b == $c; // true\n$c == $a; // false\n\n// to overcome this issue, we...\n\n// ...use strict comparison when possible\nif( $var === 'foo' )\n{\n\n}\n\n// ...use loose comparison when appropriate\nif( $_GET['number'] == 1337 )\n{\n\n}\n\n// ...check for truthness / falsiness with these helper methods\nif( __true($var) )\n{\n\n}\n\nif( __false($var) )\n{\n\n}\n\n// be aware, that __true is not always the logic negation of __false\n__true(null) // false\n__false(null) // false\n```\n\n### value\n\n```php\n// get variable if exists, otherwise null\n__v( $var )\n\n// get variable if exists, otherwise 'default'\n__v( $var, 'default' )\n\n// get first variable that exists, otherwise null\n__v( $var1, $var2, $var3 )\n\n// get variable if exists, otherwise the empty object\n__e( $var )\n__e( $var, 'default' )\n__e( $var1, $var2, $var3 )\n```\n\n### loop\n\n```php\n// loop only if exists\nforeach (__e($array) as $array__key =\u003e $array__value) {\n}\n```\n\n### try\n\n```php\n// if you are unsure, if a variable is even set before checking its existence,\n// simply prefix it with the stfu-operator @\nif( __x(@$var) )\nif( __nx(@$var) )\nif( __true(@$var) )\nif( __false(@$var) )\nif( @$var === 'foo' )\nif( @$_GET['number'] == 1337 )\necho __v(@$var)\nforeach( __e(@$array) as $array__key=\u003e$array__value)\n\n```\n\nA short note on the usage of @: In this concept we use @-operator that hides errors. We are aware of its potential misuse and also of its benefits.\n\nBe careful when using @\\$a['undefined'], there can be 2 possible errors: a missing variable or a missing index. In both cases, we intentionally prevent the parser from stopping and catch the resulting null value. Be aware: If $a is a string, @\\$a['undefined'] evaluates to $a[0] since php coerces 'undefined' to 0 and therefore exists.\n\nAnother general rule of thumb: Don't use the operator before function calls (@\\_\\_x(\\$a['undefined']).\n\nA caveat is that the @-operator does not catch any fatal runtime errors since PHP 8 anymore.\\\nFor that there is also another more sophisticated way of checking the existence of variables:\n\nIf `$var` is totally undefined, the following expressions evaluate correctly to false:\n\n```php\n__fx(fn()=\u003e$var)\n__fx(fn()=\u003e$var['foo']['bar']['baz'])\n__fx(fn()=\u003e$var())\n```\n\nBe aware that arrow functions are only available from php 7.4; Prior versions should use:\n\n```php\n__fx(function () use (\u0026$var) {\n    return $var['foo']['bar']['baz'];\n});\n```\n\nAnother approach is to pass (potentially undefined) variables by reference to the `rx`/`nrx`-helpers:\n\n```php\n__rx($var) // false\n__rx($var['foo']['bar']['baz']) // false\n__nrx($var) // true\n```\n\nBe aware that undefined variables are defined as null by php after the check:\n\n```php\narray_key_exists('foo', get_defined_vars()); // false\n__rx($foo);\narray_key_exists('foo', get_defined_vars()); // true\n```\n\n### classes\n\n```php\n// consider the following laravelish code\nclass Person\n{\n    public $id;\n\n    function __construct($id)\n    {\n        $this-\u003eid = $id;\n    }\n\n    static function find($id)\n    {\n        // mock example (normally lookup in database)\n        if( $id === 1 || $id === 2 )\n        {\n            return new Person($id);\n        }\n        else\n        {\n            return null;\n        }\n    }\n    function getAddress()\n    {\n        if( $this-\u003eid === 1 )\n        {\n            return new Address();\n        }\n        else\n        {\n            return null;\n        }\n    }\n}\nclass Address\n{\n    function getCountry()\n    {\n        return new Country();\n    }\n}\nclass Country\n{\n    function getName()\n    {\n        return 'Germany';\n    }\n}\necho Person::find(1)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // 'Germany'\necho Person::find(2)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // fails because person with id 2 has no address\necho Person::find(3)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // fails because person with id 3 does not even exist\n\n// due to the fact that the null propagating method call operator\n// (https://wiki.php.net/rfc/nullsafe_calls) is still a rfc, we cannot write\necho Person::find(3)?-\u003egetAddress()?-\u003egetCountry()?-\u003egetName(); // null\n\n// we therefore return a null model object\nclass Person\n{\n    public $id;\n\n    function __construct($id)\n    {\n        $this-\u003eid = $id;\n    }\n\n    static function find($id)\n    {\n        if( $id === 1 || $id === 2 )\n        {\n            return new Person($id);\n        }\n        else\n        {\n            return __empty();\n        }\n    }\n    function getAddress()\n    {\n        if( $this-\u003eid === 1 )\n        {\n            return new Address();\n        }\n        else\n        {\n            return __empty();\n        }\n    }\n}\nclass Address\n{\n    function getCountry()\n    {\n        return new Country();\n    }\n}\nclass Country\n{\n    function getName()\n    {\n        return 'Germany';\n    }\n}\n\n// this empty helper object is quite useful for returning an empty class which is callable with undefined functions\n__empty()\n\n// we can no conveniently call those chains...\necho Person::find(1)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // 'Germany'\necho Person::find(2)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // ''\necho Person::find(3)-\u003egetAddress()-\u003egetCountry()-\u003egetName(); // ''\n\n// ...check for existence...\nif( __x(Person::find(1)-\u003egetAddress()-\u003egetCountry()-\u003egetName()) )\n{\n\n}\n\n// ...check for strict equality...\nif( Person::find(1)-\u003egetAddress()-\u003egetCountry()-\u003egetName() === 'Germany' )\n{\n\n}\n\n// ...get a value...\necho __v( Person::find(1)-\u003egetAddress()-\u003egetCountry()-\u003egetName(), 'default' );\n\n// ...and loop when possible\nforeach( Person::find(1)-\u003egetAddress()-\u003egetCountry() as $value )\n{\n\n}\n```\n\n### helpers\n\nthere are also some other neat little helpers available.\n\n```php\n// check if all variables exist\nif( __x_all('foo', 'bar', null) ) // false\nif( __x_all(['foo', 'bar', null]) ) // false\nif( __x_all('foo', 'bar', 'baz') ) // true\nif( __x_all(['foo', 'bar', 'baz']) ) // true\nif( __nx_all('foo', 'bar', null) ) // true\nif( __nx_all('foo', 'bar', 'baz') ) // false\n\n// check if one variable exists\nif( __x_one('foo', 'bar') ) // true\nif( __x_one('', null) ) // false\nif( __x_one(['foo', 'bar']) ) // true\nif( __x_one(['', null]) ) // false\nif( __nx_one('foo', 'bar') ) // false\nif( __nx_one('', null) ) // true\n\n// check truthness of all variables\nif( __true_all(true, true, true) ) // true\nif( __true_all([true, true, null]) ) // false\nif( __true_all(true, '1') ) // true\nif( __true_all([true, false]) ) // false\nif( __false_all('foo', 'bar', null) ) // false\nif( __false_all(false) ) // true\n\n// check truthness of one variable\nif( __true_one(true, true, true) ) // true\nif( __true_one([true, true, null]) ) // true\nif( __true_one(true, '1') ) // true\nif( __true_one([true, false]) ) // true\nif( __false_one('foo', 'bar', null) ) // false\nif( __false_one(false) ) // true\n\n// cookies\n__cookie_set('cookie_name', 'cookie_value') // set cookie for 30 days\n__cookie_set('cookie_name', 'cookie_value', 7) // set cookie for 7 days\n__cookie_set('cookie_name2', ['can also', 'store', 'arrays'], 7)\n__cookie_set('cookie_name3', 'cookie_value', 7, [\n    'path' =\u003e '/',\n    'domain' =\u003e '',\n    'samesite' =\u003e 'None',\n    'secure' =\u003e true,\n    'httponly' =\u003e false\n]) // more options like SameSite (also works with PHP\u003c7.3)\n__cookie_exists('cookie_name') // true\n__cookie_get('cookie_name') // 'cookie_value'\n__cookie_get('cookie_name2') // ['can also', 'store', 'arrays']\n__cookie_delete('cookie_name')\n\n// anonymize ipv4/ipv6 addresses\n__anonymize_ip('207.142.131.005') // 207.142.131.XXX\n__anonymize_ip('001:0db8:0000:08d3:0000:8a2e:0070:7344') // 2001:0db8:0000:08d3:0000:8a2e:XXXX:XXXX\n__anonymize_ip() // anonymizes ip from $_SERVER['REMOTE_ADDR']\n\n// show password strength (1-3)\n__password_strength('3iu') // 1\n__password_strength('3iurehkHEDJ') // 2\n__password_strength('3iurehkHEDJK§$R$A') // 3\n\n// generate password\n__password_generate(\n  length: 20,\n  chars: ['a-z', 'A-Z', '0-9', '$!?'], // password contains at minimum one character of each value\n  exclude: 'lI' // exclude confusing chars\n)\n\n// calculate distance in meters between two lat/lng points with the haversine formula\n__distance_haversine([48.576809, 13.403207], [48.127719, 11.575344]) // 143999\n\n// validate iban\n__validate_iban('DE07123412341234123412') // true\n__validate_iban('DE07123412341234123442') // false\n\n// checks if string is a valid url (also works with umlauts and without external lib like idna)\n__validate_url('https://vielhuber.de') // true\n\n// check if string is a valid email (also works with umlauts and without external lib like idna)\n__validate_email('david@vielhuber.de') // true\n\n// checks if a date is valid (string in english/german, timestamp or date format)\n__validate_date('2000-01-01') // true\n__validate_date('01.01.2000') // true\n__validate_date('29.02.2001') // false\n__validate_date(new DateTime('2000-01-01')) // true\n__validate_date(946713600) // true\n\n// checks if a string is a valid date format\n__validate_date_format('d.m.Y') // true\n__validate_date_format('Y-m-d') // true\n__validate_date_format('01.m.Y') // true\n__validate_date_format('foo') // false\n\n// checks if a string is a valid date modifier\n__validate_date_mod('+6 months') // true\n__validate_date_mod('foo') // false\n\n// simple date helper\n__date('2000-01-01') // 2000-01-01\n__date('2000-01-01', 'd.m.Y') // 01.01.2000\n__date('2001-02-29', 'd.m.Y') // null; returns null if date is invalid, otherwise formatted date\n__date('2000-01-01', '+6 months') // 2000-07-01; allows date modifications\n__date('2000-01-01', 'd.m.Y', '+6 months') // 01.07.2000\n__date('01.01.2000') // 2000-01-01; also accepts other formats\n__date('01.01.20') // 2020-01-01; correctly interprets some german variants\n__date('01.01.39') // 2039-01-01; exceeds 32-bit ranges\n__date('now') // 2019-05-28; also accepts strings\n__date('2019-12-02 12:00:00', 'd.m.Y H:i:s') // 02.12.2019 12:00:00\n__date('2019-12-02T12:00:00', 'd.m.Y H:i:s') // 02.12.2019 12:00:00\n__date() // 2019-05-28\n__date('') // null\n__date(null) // null\n__date('d.m.Y',null) // null\n$unknown = null; __date($unknown) // null\n__date(strtotime('2000-01-01'), 'd.m.Y') // 01.01.2000; also accepts timestamps\n__date(strtotime('2000-01-01'), 'd.m.Y', '+6 months') // 01.07.2000\n__date(new DateTime('2000-01-01'), 'd.m.Y') // 01.01.2000; also accepts datetime objects\n__date('d.m.Y') // 01.01.2000; you can even switch arguments (they are sorted magically)\n__date('d.m.Y', 'now') // 2019-05-28\n__date('+6 months') // 2019-11-28\n\n// outputs a valid formatted value for input datetime-local\n__datetime('01.01.2000') // 2000-01-01T00:00\n__datetime('01.01.2000 18:00') // 2000-01-01T18:00\n\n// set time of date as string to begin of day\n__date_reset_time('2000-01-01 16:30:00') // 2000-01-01 00:00:00\n__date_reset_time('2000-01-01') // 2000-01-01 00:00:00\n__date_reset_time('01.01.2000') // 2000-01-01 00:00:00\n\n// get age from date\n__age_from_date('2000-01-01') // 20\n__age_from_date('2000-01-01', '2010-01-01') // 10\n__age_from_date_weeks('2000-01-01') // 1083\n__age_from_date_weeks('2000-01-01', '2010-01-01') // 521\n__age_from_date_days('2000-01-01') // 7587\n__age_from_date_days('2000-01-01', '2010-01-01') // 3653\n\n// strftime \u003e=php 8.1\nsetlocale(LC_TIME, 'de_DE.utf8');\n__strftime('%A, %d. %B %Y', strtotime('2001-01-01')); // Montag, 01. Januar 2001\n\n// remove useless zero digits from decimals\n__remove_zero_decimals(1337) // 1337\n__remove_zero_decimals('1337') // 1337\n__remove_zero_decimals('1337.40') // 1337.4\n__remove_zero_decimals('1337,40') // 1337.4\n__remove_zero_decimals(1337.0) // 1337\n__remove_zero_decimals(1337.4) // 1337.4\n__remove_zero_decimals(1337.42) // 1337.42\n__remove_zero_decimals(1337.424) // 1337.424\n\n// remove leading zeros\n__remove_leading_zeros('01337') // 1337\n\n// normalizes phone numbers (din, germany)\n__phone_normalize('(0)89-12 456 666') // +49 89 12456666\n__phone_tokenize('(0)89-12 456 666') // ['country_code' =\u003e '49', 'area_code' =\u003e '89', 'number' =\u003e '12456666']\n__phone_country_codes() // ['49', ...]\n__phone_area_codes() // ['89', '151', ...]\n__phone_area_codes_landline() // ['89', ...]\n__phone_area_codes_mobile() // ['151', ...]\n__phone_is_landline('(0)89-12 456 666') // true\n__phone_is_mobile('(0)89-12 456 666') // false\n\n// parse cumulated mail string (RFC5322)\n__email_tokenize_str2arr('Max Mustermann \u003cmail1@tld.com\u003e; mail2@tld.com')\n// [['email' =\u003e 'mail1@tld.com', 'name' =\u003e 'Max Mustermann'],['email' =\u003e 'mail2@tld.com', 'name' =\u003e null]];\n__email_tokenize_arr2str([['email' =\u003e 'mail1@tld.com', 'name' =\u003e 'Max Mustermann'],['email' =\u003e 'mail2@tld.com', 'name' =\u003e null]]);\n// 'Max Mustermann \u003cmail1@tld.com\u003e; mail2@tld.com'\n\n// normalize url\n__url_normalize('www.tld.com') // https://www.tld.com\n__url_normalize('http://tld.com/') // http://tld.com\n\n// minify html\n__minify_html('\u003c!DOCTYPE html\u003e\n\u003ctitle\u003eshortest valid html5 document\u003c/title\u003e\n\u003cp\u003eyay\u003c/p\u003e') // \u003c!DOCTYPE html\u003e\u003ctitle\u003eshortest valid html5 document\u003c/title\u003e\u003cp\u003eyay\u003c/p\u003e\n\n// proper string to domdocument and domdocument to string conversion (respects original structure and fixes lots of caveats)\n__dom_to_str(__str_to_dom('\u003cul\u003e\u003cli\u003e\u003c/li\u003e\u003cli\u003e\u003c/li\u003e\u003c/ul\u003e')) // \u003cul\u003e\u003cli\u003e\u003c/li\u003e\u003cli\u003e\u003c/li\u003e\u003c/ul\u003e\n__dom_to_str(__str_to_dom('\u003ccustom-component @click.prevent=\"foo()\"\u003e\u003c/custom-component\u003e')) // \u003ccustom-component @click.prevent=\"foo()\"\u003e\u003c/custom-component\u003e\n\n// translate strings\n__translate_google('Sein oder Nichtsein; das ist hier die Frage.', 'de', 'en', '**API Key**') // To be or not to be; that is the question.\n__translate_microsoft('Sein oder Nichtsein; das ist hier die Frage.', 'de', 'en', '**API Key**') // Being or not being; that is the question here.\n__translate_deepl('Sein oder Nichtsein; das ist hier die Frage.', 'de', 'en', '**API Key**') // To be or not to be; that is the question here.\n\n// work conveniently with all major ai apis\n$ai = __ai(\n    service: 'chatgpt', // chatgpt|claude|gemini\n    model: 'gpt-4o', // gpt-4o|claude-3-5-sonnet-20240620|gemini-1.5-flash|...\n    temperature: 0.7, // controls the randomness of the text generated\n    api_key: '**API Key**'\n);\n$ai-\u003eask('Wer wurde 2018 Fußball-Weltmeister?');\n  // ['response' =\u003e 'Frankreich.', 'success' =\u003e true]\n$ai-\u003eask('Was ist auf dem Bild zu sehen?', 'lorem.jpg');\n  // ['response' =\u003e 'Auf dem Bild ist eine Katze zu sehen.', 'success' =\u003e true]\n$ai-\u003eask('Wie lautet das erste Wort in der PDF?', 'lorem.pdf');\n  // ['response' =\u003e 'Das erste Wort lautet \"Lorem\".', 'success' =\u003e true]\n$ai-\u003eask('Fasse die folgenden Dokumente zusammen.', ['1.pdf','2.jpg']);\n  // ['response' =\u003e '...', 'success' =\u003e true]\n$ai = __ai(\n    session_id: $ai-\u003esession_id // submit session to continue a conversation afterwards ($ai-\u003esession_id)\n);\n$ai-\u003eask('Was habe ich vorher gefragt?');\n  // ['response' =\u003e 'Du hast gefragt: \"Wie lautet das erste Wort in der PDF?\"', 'success' =\u003e true]\n$ai-\u003ecleanup(); // (remotely) deletes the data of the current session\n$ai-\u003ecleanup_all(); // (remotely) deletes all data\n$ai-\u003eenable_log('output.log');\n$ai-\u003edisable_log();\n\n// remove emojis from string\n__remove_emoji('Lorem 🤷 ipsum ❤ dolor 🥺 med') // Lorem  ipsum  dolor  med\n\n// remove accents from string\n__remove_accents('Çººĺ') // Cool\n__remove_accents('Äťśçĥ') // Ätsch\n__remove_accents('Äťśçĥ', true) // Aetsch\n\n// remove non printable chars from string\n__remove_non_printable_chars('foo\bbar') // foobar\n\n// string to slug (sanitize string)\n__slug('This string will be sanitized!') // this-string-will-be-sanitized\n\n// generate a random string\n__random_string() // edPhi34d\n__random_string(10) // abCa321aC6\n__random_string(16, 'idkfa') // idifafafifaifafk\n\n// shuffle array (no reference)\n__shuffle(['foo','bar','baz']); // ['bar','baz','foo']\n\n// shuffle associative array and preserve keys\n__shuffle_assoc(['foo' =\u003e 'bar', 'bar' =\u003e 'baz', 'baz' =\u003e 'foo']) // ['bar' =\u003e 'baz', 'baz' =\u003e 'foo', 'foo' =\u003e 'bar']\n\n// sort with umlauts (DIN-5007-2)\n$arr = ['äther', 'Äther2', 'Ü12.pdf', 'Ü2.pdf'];\nusort($arr, function($a, $b) { return __mb_strcmp($a, $b); }); // ['Äther2', 'Ü12.pdf', 'Ü2.pdf', 'äther']\nusort($arr, function($a, $b) { return __mb_strcasecmp($a, $b); }); // ['äther', 'Äther2', 'Ü12.pdf', 'Ü2.pdf']\nusort($arr, function($a, $b) { return __mb_strnatcmp($a, $b); }); // ['Äther2', 'Ü2.pdf', 'Ü12.pdf', 'äther']\nusort($arr, function($a, $b) { return __mb_strnatcasecmp($a, $b); }); // ['äther', 'Äther2', 'Ü2.pdf', 'Ü12.pdf']\n\n// array order sort by many\n$arr = [['a' =\u003e 17, 'b' =\u003e 42], ['a' =\u003e 13, 'b' =\u003e 19]]\nusort($arr, __array_multisort([ ['a', 'asc'], ['b', 'asc'] ])) // [['a' =\u003e 13, 'b' =\u003e 19], ['a' =\u003e 17, 'b' =\u003e 42]]\nusort($arr, __array_multisort(function($v) { return [ [$v['a'], 'asc'], [$v['b'], 'asc'] ]; })) // [['a' =\u003e 13, 'b' =\u003e 19], ['a' =\u003e 17, 'b' =\u003e 42]]\ncollect($arr)-\u003esort( __array_multisort([ ['a', 'asc'], ['b', 'asc'] ]) ) // can also be used by laravel collections\n// considers umlauts (DIN-5007-2)\n$arr = [['foo' =\u003e 'zoo'], ['foo' =\u003e 'Äther']]\nusort($arr, __array_multisort([['foo', 'asc']])) // [['foo' =\u003e 'Äther'], ['foo' =\u003e 'zoo']]\n\n// array group by\n$a = ['a' =\u003e 17, 'b' =\u003e 42, 'c' =\u003e 'foo']\n$b = ['a' =\u003e 19, 'b' =\u003e 20, 'c' =\u003e 'bar']\n$c = ['a' =\u003e 17, 'b' =\u003e 42, 'c' =\u003e 'baz']\n$arr = [$a, $b, $c]\n__array_group_by($arr, 'a') // [17 =\u003e [$a, $c], 19 =\u003e [$b]]\n__array_group_by($arr, 'a', 'b') // [17 =\u003e [42 =\u003e [$a, $c]], 19 =\u003e [20 =\u003e [$b]]]\n__array_group_by($arr, function($v) { return $v['a']; }) // [17 =\u003e [$a, $c], 19 =\u003e [$b]]\n__array_group_by($arr, function($v) { return $v['a']; }, function($v) { return $v['b']; }) // [17 =\u003e [42 =\u003e [$a, $c]], 19 =\u003e [20 =\u003e [$b]]]\n$arr = collect([collect($a), collect($b), collect($c)])\n__array_group_by($arr, function($v) { return $v-\u003eget('a'); })  // can also be used by laravel collections\n\n// array group by aggregate\n$a = ['a' =\u003e 17, 'b' =\u003e 42, 'c' =\u003e 'foo']\n$b = ['a' =\u003e 19, 'b' =\u003e 20, 'c' =\u003e 'bar']\n$c = ['a' =\u003e 17, 'b' =\u003e 42, 'c' =\u003e 'baz']\n$arr = [$a, $b, $c]\n__array_group_by_aggregate($arr, 'a', [\n    'b' =\u003e function($a, $b) { return $a+$b; },\n    'c' =\u003e function($a, $b) { return $a.', '.$b; },\n]) // [['a' =\u003e 17, 'b' =\u003e 84, 'c' =\u003e 'foo, baz'], ['a' =\u003e 19, 'b' =\u003e 20, 'c' =\u003e 'bar']]\n__array_group_by_aggregate($arr, ['a','b'], [\n    'c' =\u003e function($a, $b) { return $a.', '.$b; },\n]) // [['a' =\u003e 17, 'b' =\u003e 42, 'c' =\u003e 'foo, baz'], ['a' =\u003e 19, 'b' =\u003e 20, 'c' =\u003e 'bar']]\n\n// array unique (that works with multidimensional arrays)\n__array_unique([1,2,2]) // [1,2]\n__array_unique([['foo'=\u003e'bar'],['bar'=\u003e'baz'],['foo'=\u003e'bar']]) // [['foo'=\u003e'bar'],['bar'=\u003e'baz']]\n\n// recursively change values of array of arrays (only leaf nodes)\n__array_map_deep(['foo','bar'=\u003e['baz','gnarr']], function($a) { return $a.'!'; }) // ['foo!','bar'=\u003e['baz!','gnarr!']]\n__array_map_deep([[[[[[[[[[[[[[[true]]]]]]]]]]]]]]], function($a) { return !$a; }) // [[[[[[[[[[[[[[[false]]]]]]]]]]]]]]]\n__array_map_deep(\n    [[[[[[[[[[[[[[[42 =\u003e 'no', 7 =\u003e 'ok']]]]]]]]]]]]]]],\n    function ($value, $key) { return $key === 42 ? $value : $value . '!'; }\n) // [[[[[[[[[[[[[[[42 =\u003e 'no', 7 =\u003e 'ok!']]]]]]]]]]]]]]]\n__array_map_deep(\n    ['foo'=\u003e['bar'=\u003e'baz'],'bar'=\u003e['baz'=\u003e'gnarr'],'gnarr'=\u003e['foo'=\u003e'gnaz']],\n    function($value,$key,$key_chain) { return in_array('bar',$key_chain)?$value.'!':$value; }\n) // ['foo'=\u003e['bar'=\u003e'baz!'],'bar'=\u003e['baz'=\u003e'gnarr!'],'gnarr'=\u003e['foo'=\u003e'gnaz']]\n$output = [];\narray_map_deep(\n    [1=\u003e[2=\u003e[3=\u003e[4=\u003e[5=\u003e'ok1'],6=\u003e[7=\u003e'ok2']]]],8=\u003e'ok3'],\n    function($value,$key,$key_chain) use(\u0026$output) { $output[] = $value.': '.implode('.',$key_chain); }\n)\necho implode(' - ', $output) // ok1: 1.2.3.4.5, ok2: 1.2.3.6.7, ok3: 8\n__array_map_deep(['foo','bar'=\u003e(object)['baz','gnarr']], function($a) { return $a.'!'; }) // ['foo!','bar'=\u003e(object)['baz!','gnarr!']]\n__array_map_deep(['foo','bar'=\u003ejson_encode(['baz','gnarr'])], function($a) { return $a.'!'; }) // ['foo!', 'bar'=\u003ejson_encode(['baz!', 'gnarr!'])]\n\n// recursively change values of array of arrays (with parent nodes; be careful when changing the array structure)\n__array_map_deep_all(['foo'=\u003e'bar','bar'=\u003e['baz'=\u003e'gnarr','gnarr'=\u003e'baz']], function($value, $key, $key_chain) {\n    if (is_array($value) \u0026\u0026 array_key_exists('baz', $value) \u0026\u0026 $value['baz'] === 'gnarr') {\n        $value['gnarr'] = 'baz2';\n    }\n    return $value;\n}) // ['foo'=\u003e'bar','bar'=\u003e['baz'=\u003e'gnarr','gnarr'=\u003e'baz2']]\n\n// array walk recursive (with parent nodes; be careful when changing the array structure)\n$arr = ['foo' =\u003e 'bar', 'bar' =\u003e ['baz' =\u003e 'gnarr', 'gnarr' =\u003e 'baz']]\n__array_walk_recursive_all($arr, function (\u0026$value, $key, $key_chain) {\n    if (is_array($value) \u0026\u0026 array_key_exists('baz', $value) \u0026\u0026 $value['baz'] === 'gnarr') {\n        $value['gnarr'] = 'baz2';\n    }\n})\n$arr // ['foo'=\u003e'bar','bar'=\u003e['baz'=\u003e'gnarr','gnarr'=\u003e'baz2']]\n\n// array filter recursive\n__array_filter_recursive_all(\n    ['foo' =\u003e ['foo' =\u003e ['foo' =\u003e ['foo' =\u003e ['foo' =\u003e []]]]]],\n    function($value, $key, $key_chain) { return $key === 'foo' \u0026\u0026 empty($value); }\n) // []\n\n// array map for keys\n__array_map_keys(function($k) { return $k.'!'; }, ['foo' =\u003e 'bar', 'bar' =\u003e 'baz']) // ['foo!' =\u003e 'bar', 'bar!' =\u003e 'baz']\n\n// array map for keys and values\n__array_map_keys_values(function($k,$v) { return [$k.'!', $v.'?']; }, ['foo' =\u003e 'bar', 'bar' =\u003e 'baz']) // ['foo!' =\u003e 'bar?', 'bar!' =\u003e 'baz?']\n\n// ask question on cli\n$answer = __ask('What\\'s your name?') // free input\n$answer = __ask('Choose your destiny:\n[1] red pill\n[2] blue pill', [1,2]) // only accept specific chars/integers\n\n// show progress on cli\necho 'Searching for TOE (theory of everything)...'.PHP_EOL;\n$i = 0;\nwhile($i \u003c= 100) {\n    __progress($i, 100, 'Loading...', 75, '#');\n    usleep($i \u003c 90 ? 10000 : 250000);\n    $i++;\n}\necho PHP_EOL.'Answer: 42';\n/*\nSearching for TOE (theory of everything)...\nLoading... [############################################################################] 100%\nAnswer: 42\n*/\n\n// simple multibyte version of sprintf\nsprintf('%7.7s', 'mäh') // '   mäh'\n__mb_sprintf('%7.7s', 'mäh') // '    mäh'\n\n// encode arbitrary data to string\n$data = ['foo' =\u003e 'bar', 'bar' =\u003e 'baz'];\n$str = __encode_data($data) // 'YToyOntzOjM6ImZvbyI7czozOiJiYXIiO3M6MzoiYmFyIjtzOjM6ImJheiI7fQ=='\n__decode_data($str) // ['foo' =\u003e 'bar', 'bar' =\u003e 'baz']\n// support for multiple arguments\n__decode_data(__encode_data(['foo', 'bar'])) // ['foo', 'bar']);\n__decode_data(__encode_data('foo', 'bar')) // ['foo', 'bar']);\n// this can be useful to enrich form fields with additional data\necho '\u003cinput name=\"foo['.__encode_data($data).']\" value=\"bar\" /\u003e';\n__decode_data(array_key_first($_POST['foo'])) // ['foo' =\u003e 'bar', 'bar' =\u003e 'baz']\n// this can also be useful to create a poor mans index\nforeach($a as $a__value) { $index[__encode_data($a__value['foo'],$a__value['bar'])] = null; }\nforeach($b as $b__value) { if(array_key_exists(__encode_data($b__value['foo'],$b__value['bar']),$index)) { /* ... */ } }\n\n// generate uuid/guid v4\n__uuid() // 19028aea-ccb6-4b32-9e5d-1243c3a77bb1\n\n// validate uuid v4\n__validate_uuid('19028aea-ccb6-4b32-9e5d-1243c3a77bb1') // true\n__validate_uuid('00000000-0000-0000-0000-000000000000') // false\n__validate_uuid('00000000-0000-0000-0000-000000000000', false) // true (weak check)\n\n// create lexicographically ordered string ids like in firebase\n__pushId() // -LMsSyccg4OavBCZxRAA\n\n// strip string\n__strip('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam.', 12) // Lorem ipsum...\n\n// strip numeric (0-9.,)\n__strip_numeric('the answer is 42.00') // the answer is\n\n// strip non-numeric (all except 0-9.,)\n__strip_nonnumeric('the answer is 42.00') // 42.00\n\n// strip digit (0-9)\n__strip_numeric('the answer is 42.00') // the answer is\n\n// strip non-digit (all except 0-9)\n__strip_nondigit('the answer is 42') // 42\n\n// strip non-chars (all except a-z and umlauts)\n__strip_nonchars('the Änswer is 42.-+\u0026!foo') // the Änswer is foo\n\n// strip whitespace\n__strip_whitespace('the answer is 42') // theansweris42\n__strip_whitespace('the     answeris42') // theansweris42\n\n// strip whitespace (collapsed)\n__strip_whitespace_collapsed('the answer is 42') // the answer is 42\n__strip_whitespace_collapsed('the     answer             is 42 ') // the answer is 42\n\n// strip specific tags (optionally with content) of html string\n__strip_tags('\u003cp\u003efoo\u003c/p\u003e\u003ciframe src=\"#\"\u003e\u003c/iframe\u003e\u003cscript\u003ealert();\u003c/script\u003e\u003cp\u003ebar\u003c/p\u003e', 'script') // \u003cp\u003efoo\u003c/p\u003e\u003ciframe src=\"#\"\u003e\u003c/iframe\u003ealert();\u003cp\u003ebar\u003c/p\u003e\n__strip_tags('\u003cp\u003efoo\u003c/p\u003e\u003ciframe src=\"#\"\u003e\u003c/iframe\u003e\u003cscript\u003ealert();\u003c/script\u003e\u003cp\u003ebar\u003c/p\u003e', ['iframe','script'], true) // \u003cp\u003efoo\u003c/p\u003e\u003cp\u003ebar\u003c/p\u003e\n\n// split string by new line\n__split_newline('foo\nbar\nbaz') // ['foo','bar','baz']\n\n// add space after every 4th character (first remove whitespace, do it bytesafe, don't add a trailing space like chunk_split)\n__split_whitespace('DE07123412341234123412', 4) // 'DE07 1234 1234 1234 1234 12'\n__split_whitespace(' föö bäär ', 3) // 'föö bää r'\n\n// remove empty lines\n__remove_emptylines('foo\n\nbar\nbaz') // foo\\nbar\\nbaz\n\n// remove new lines\n__remove_newlines('foo\nbar\u003cbr/\u003e\nbaz') // foobarbaz\n__remove_newlines('foo\nbar\u003cbr/\u003e\nbaz', ' ') // foo bar baz\n\n// reverse of nl2br\n__br2nl('foo\u003cbr/\u003ebar') // foo\n//bar\n\n// truncate/trim long strings\n__truncate_string('Lorem ipsum dolor sit amet, consectetuer.', 20); // Lorem ipsum dolor ...\n__truncate_string('Lorem ipsum dolor sit amet, consectetuer.', 20, '…'); // Lorem ipsum dolor …\n\n// trim whitespace (including \u0026nbsp;, tabs and line breaks)\n__trim_whitespace('      string including nasty whitespace chars  ') // 'string including nasty whitespace chars'\n\n// trim every item in array\n__atrim(['foo\n','bar','\nbaz']) // ['foo','bar','baz']\n\n// trim every line in multiline string\n__trim_every_line('foo\n bar\nbaz ') // foo\n//bar\n//baz\n\n// trim like it should be:\n// - works recursively\n// - works with whole words\n__trim('\u003cbr\u003e\u003cbr/\u003e\u003cp\u003e\u003c/p\u003efoo bar baz\u003cbr/\u003e\u003cbr/\u003e\u003cbr\u003e\u003cbr/\u003e', ['\u003cbr/\u003e','\u003cbr\u003e','\u003cp\u003e\u003c/p\u003e']) // foo bar baz\n__ltrim('\u003cbr\u003e\u003cbr/\u003e\u003cp\u003e\u003c/p\u003efoo bar baz\u003cbr/\u003e\u003cbr/\u003e\u003cbr\u003e\u003cbr/\u003e', ['\u003cbr/\u003e','\u003cbr\u003e','\u003cp\u003e\u003c/p\u003e']) // foo bar baz\u003cbr/\u003e\u003cbr/\u003e\u003cbr\u003e\u003cbr/\u003e\n__rtrim('\u003cbr\u003e\u003cbr/\u003e\u003cp\u003e\u003c/p\u003efoo bar baz\u003cbr/\u003e\u003cbr/\u003e\u003cbr\u003e\u003cbr/\u003e', ['\u003cbr/\u003e','\u003cbr\u003e','\u003cp\u003e\u003c/p\u003e']) // \u003cbr\u003e\u003cbr/\u003e\u003cp\u003e\u003c/p\u003efoo bar baz\n\n// remove keys from associative array\n__arr_without(['foo' =\u003e 'bar', 'bar' =\u003e 'baz', 'baz' =\u003e 'foo'], ['bar', 'baz']) // ['foo' =\u003e 'bar']\n\n// reverse string (grapheme safe, works also without intl extension)\n__strrev('hello❤️world') // dlrow❤️olleh\n\n// check if string is json\n__string_is_json('[]') // true\n__string_is_json('{\"foo\":\"bar\"}') // true\n__string_is_json('[\"foo\" =\u003e \"bar\"]') // false\n__string_is_json([]) // false\n__string_is_json((object)[]) // false\n\n// check if string is html\n__string_is_html('foo') // false\n__string_is_html('\u003cp\u003efoo\u003c/p\u003e') // true\n__string_is_html('foo bar') // false\n__string_is_html('foo\u0026nbsp;bar') // true\n\n// check if string is serialized\n__is_serialized('a:1:{s:3:\"foo\";s:3:\"bar\";}') // true\n__is_serialized('idkfa') // false\n__is_serialized('b:0;') // true\n__is_serialized('a:1:{s:3:\\\"foo\\\";s:3:\\\"bar\\\";}') // false\n__is_serialized('a:1:{42}') // false\n\n// check if string is base64 encoded\n__is_base64_encoded('dGhpcyBpcyBjb29sIHN0dWZm') // true\n__is_base64_encoded('#ib3498r') // false\n__is_base64_encoded('al3Vna##2dqa#Gdm') // false\n__is_base64_encoded((object)[]) // false\n\n// check if variable is of laravel type 'Illuminate\\Database\\Eloquent\\Builder'\n__is_eloquent_builder($var) // true|false\n\n// extract part from string\n__extract('\u003ca href=\"#foo\"\u003ebar\u003c/a\u003e','href=\"','\"\u003e') // #foo\n__extract('\u003ca href=\"#foo\"\u003ebar\u003c/a\u003e','\"\u003e','\u003c/a') // bar\n\n// find all occurences of substring in string\n__strposx('bar foo baz foobar', 'foo') // [4,12]\n\n// find nth occurence of substring in string\n__strposnth('bar foo baz foobar', 'foo', 2) // 12\n\n// check if key is first/last key in foreach loop\n$array = ['foo','bar'];\nforeach($array as $array__key=\u003e$array__value)\n{\n    if( __fkey($array__key, $array) ) { }\n    if( __lkey($array__key, $array) ) { }\n}\n$array = ['foo','bar'];\nforeach($array as $array__value)\n{\n    // (warning: don't call get_loop_status($array) twice inside an interation,\n    // since it modifies the internal pointer of the array)\n    $loop_status = __loop_status($array);\n\n    if($loop_status-\u003eis_first) {}\n    if($loop_status-\u003eis_last) {}\n    if($loop_status-\u003eis_not_first) {}\n    if($loop_status-\u003eis_not_last) {}\n}\n\n// get last item of array\n__last(['foo', 'bar', 'baz']) // 'baz'\n\n// get first item of array\n__first(['foo', 'bar', 'baz']) // 'foo'\n__first(['foo' =\u003e 'bar', 'bar' =\u003e 'baz']) // 'bar'\n\n// get first key of array\n__first_key(['foo' =\u003e 'bar', 'bar' =\u003e 'baz']) // 'foo'\n\n// get random element from array\n__rand(['foo', 'bar', 'baz']) // 'bar'\n\n// remove first/last item of array (and reindex array)\n__remove_first(['foo', 'bar', 'baz']) // ['bar','baz']\n__remove_last(['foo', 'bar', 'baz']) // ['foo','bar']\n\n// uppercase helpers (mb safe)\n__first_char_is_uppercase('Foo') // true\n__first_char_is_uppercase('bar') // true\n__set_first_char_uppercase('baz') // Baz\n__set_first_char_uppercase('übel') // Übel\n\n// convert array to object\n__array_to_object(['foo']) // {0: 'foo'}\n__array_to_object(['foo','bar']) // {0: 'foo', 1: 'bar'}\n__array_to_object(['foo' =\u003e 'bar']) // {foo: 'bar'}\n__array_to_object(['foo','bar' =\u003e ['foo','bar']]) // {0: 'foo', bar: {0: 'foo', 1: 'bar'}}\n\n// convert object to array\n__object_to_array((object)['foo']) // ['foo']\n__object_to_array((object)['foo','bar']) // ['foo','bar']\n__object_to_array((object)['foo' =\u003e 'bar']) // ['foo' =\u003e 'bar']\n__object_to_array((object)['foo','bar' =\u003e (object)['foo','bar']]) // ['foo', 'bar' =\u003e ['foo','bar']]\n\n// convert variable to array\n__array() // []\n__array('foo') // ['foo']\n__array(['foo']) // ['foo']\n__array(['foo','bar']) // ['foo','bar']\n__array((object)['foo','bar']) // ['foo','bar']\n__array((object)['foo','bar' =\u003e (object)['foo','bar']]) // ['foo', 'bar' =\u003e ['foo','bar']]\n\n// convert variable to object\n__object() // {}\n__object('foo') // {0: 'foo'}\n__object(['foo']) // {0: 'foo'}\n__object(['foo','bar']) // {0: 'foo', 1: 'bar'}\n__object(['foo' =\u003e 'bar']) // {foo: 'bar'}\n__object((object)['foo','bar']) // {0: 'foo',1: 'bar'}\n__object(['foo','bar' =\u003e ['foo','bar']]) // {0: 'foo', bar: {0: 'foo', 1: 'bar'}}\n\n// check if item can be looped (is a non empty array, object or collection)\n__can_be_looped([1,2]) // true\n__can_be_looped((object)[1,2]) // true\n__can_be_looped([]) // false\n\n// generate nested foreach loop of n levels\n$a = [1, 2]; $b = [3, 4]; $c = [5, 6]; $output = [];\n$fn = function ($x, $y, $z) use (\u0026$output) { $output[] = $x . '' . $y . '' . $z; };\n__foreach_nested($a, $b, $c, $fn);\nprint_r($output);\n// same as foreach($a as $a__value) { foreach($b as $b__value) { foreach($c as $c__value) { $fn($x, $y, $z); } }\n// ['135', '136', '145', '146', '235', '236', '245', '246']\n\n// removes recursively all items from array or object or collection that are considered empty (indexes are not reindexed)\n$arr = [0 =\u003e ['foo',0,'0',null,''], null, 2 =\u003e [['',''],[null]]];\n__remove_empty($arr) // [0 =\u003e ['foo',0,'0']]\n__remove_empty($arr, [0,'0']) // [0 =\u003e ['foo']] (provide additional values that are considered empty)\n__remove_empty($arr, null, function ($value) {\n    return (is_array($value) \u0026\u0026 empty($value)) || (is_string($value) \u0026\u0026 $value === '');\n}) // [0 =\u003e ['foo',0,'0',null], null, 2 =\u003e [1 =\u003e [null]]] (provide a callback function)\n\n// remove item from array or object and fill up gaps (if numeric keys are available)\n__remove_by_key([0 =\u003e 'foo', 1 =\u003e 'bar', 2 =\u003e 'baz'], 1) // [0 =\u003e 'foo', 1 =\u003e 'baz']\n__remove_by_key(['foo' =\u003e 1, 'bar' =\u003e 2, 'baz' =\u003e 3], 'foo') // ['bar' =\u003e 2, 'baz' =\u003e 3]\n__remove_by_key((object)[0 =\u003e 'foo', 1 =\u003e 'bar', 2 =\u003e 'baz'], 1) // (object)[0 =\u003e 'foo', 1 =\u003e 'baz']\n__remove_by_value([0 =\u003e 'foo', 1 =\u003e 'bar', 2 =\u003e 'baz'], 'bar') // [0 =\u003e 'foo', 1 =\u003e 'baz']\n__remove_by_value(['foo' =\u003e 1, 'bar' =\u003e 2, 'baz' =\u003e 3], 1) // ['bar' =\u003e 2, 'baz' =\u003e 3]\n__remove_by_value((object)[0 =\u003e 'foo', 1 =\u003e 'bar', 2 =\u003e 'baz'], 'bar') // (object)[0 =\u003e 'foo', 1 =\u003e 'baz']\n\n// get max array depth\n__arr_depth(['foo' =\u003e 'bar', 'bar' =\u003e ['baz' =\u003e ['gnarr' =\u003e 'gnaz']]]) // 3\n\n// (conditional) append/prepend to array\n__arr_append(['foo'], 'bar') // ['foo','bar']\n__arr_prepend(['bar'], 'foo') // ['foo','bar']\n__arr_append(['foo'], 'bar', 42%7 === 0) // ['foo','bar']\n__arr_prepend(['bar'], 'foo', 0%1 === 1) // ['foo']\n__arr_append(__arr_append(__arr_append([], 'foo'), 'bar', false), 'baz') // ['foo','baz']\n\n// turn values of array \"inside out\"\n// this is useful when working with html forms\n/*\n\u003cli\u003e\u003cinput type=\"text\" name=\"data[option1][]\" /\u003e\u003cinput type=\"text\" name=\"data[option2][]\" /\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput type=\"text\" name=\"data[option1][]\" /\u003e\u003cinput type=\"text\" name=\"data[option2][]\" /\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput type=\"text\" name=\"data[option1][]\" /\u003e\u003cinput type=\"text\" name=\"data[option2][]\" /\u003e\u003c/li\u003e\n\u003cli\u003e\u003cinput type=\"text\" name=\"data[option1][]\" /\u003e\u003cinput type=\"text\" name=\"data[option2][]\" /\u003e\u003c/li\u003e\n*/\n__inside_out_values([\n    'option1' =\u003e [0 =\u003e 'foo', 1 =\u003e 'bar', 2 =\u003e 'baz', 3 =\u003e ''],\n    'option2' =\u003e [0 =\u003e 'bar', 1 =\u003e 'baz', 2 =\u003e 'foo', 3 =\u003e null]\n])\n/*\n[\n    0 =\u003e ['option1' =\u003e 'foo','option2' =\u003e 'bar'],\n    1 =\u003e ['option1' =\u003e 'bar','option2' =\u003e 'baz'],\n    2 =\u003e ['option1' =\u003e 'baz','option2' =\u003e 'foo']\n]\n*/\n\n// converts recursively nested arrays into objects\n// this is useful when working with state in vue/redux\n// objects are automatically keyed by id (if property \"id\" is available)\n__arrays_to_objects(['foo' =\u003e ['bar','baz'], 'bar' =\u003e [(object)['id' =\u003e 7, 'name' =\u003e 'foo'], (object)['id' =\u003e 42, 'name' =\u003e 'bar']]])\n// { 'foo': { 0: 'bar', 1: 'baz' }, 'bar' =\u003e { 7: { 'id': 7, 'name': 'foo' }, 7: { 'id': 42, 'name': 'bar' } } }\n\n// read/write data to arrays in dot notation\n__array_get(['foo'=\u003e['bar'=\u003e['baz'=\u003e42]]], 'foo.bar.baz'); // 42\n__array_set(['foo'=\u003e['bar'=\u003e['baz'=\u003e42]]], 'foo.bar.baz', 7); // ['foo'=\u003e['bar'=\u003e['baz'=\u003e7]]]\n\n// highlight strings\n__highlight('that is a search string', 'is') // that \u003cstrong class=\"highlight\"\u003eis\u003c/strong\u003e a search string\n__highlight('abc def geh ijk lmn opq rst abc def geh ijk lmn opq rst', 'ijk', true, 5) // '... geh \u003cstrong class=\"highlight\"\u003eijk\u003c/strong\u003e lmn ... geh \u003cstrong class=\"highlight\"\u003eijk\u003c/strong\u003e lmn ...'\n\n// checks if variable is an integer (accepts also well formed strings)\n__is_integer(0) // true\n__is_integer(42) // true\n__is_integer(4.2) // false\n__is_integer(0.42) // false\n__is_integer(42.) // true\n__is_integer('42') // true\n__is_integer('a42') // false\n__is_integer('42a') // false\n__is_integer(0x24) // true\n__is_integer(8372468764378627868742367883268) // true (in comparison to is_int())\n__is_integer('8372468764378627868742367883268') // true\n__is_integer(' 1337') // false\n__is_integer('1337 ') // false\n__is_integer([]) // false\n__is_integer(null) // false\n__is_integer(false) // false\n__is_integer(true) // false\n\n// convert float to nice ratio\n__float_to_ratio(1920/600) // 16:5\n__float_to_ratio(1/3) // 1:3\n\n// output arguments in a reader friendly way\n__o($var)\n__o($var1, $var2, $var3)\n__o('\u003cstrong\u003efoo\u003c/strong\u003e') // html codes are not parsed: array(1) { [0]=\u003e string(32) \"\u003cstrong\u003efoo\u003c/strong\u003e\" }\n\n// same as __o but die afterwards\n__d($var)\n\n// flatten multidimensional array (keys)\n__flatten_keys(['foo' =\u003e ['bar' =\u003e 'baz']]) // ['foo','bar']\n\n// flatten multidimensional array (values)\n__flatten_values(['foo' =\u003e 'bar', 'bar' =\u003e ['baz', 'foo']]) // ['bar','baz','foo']\n\n// get nth element of concatenized array\n__expl(' ', 'foo bar baz', 1) // bar\n__expl(' ', 'foo bar baz') // foo\n\n// redirect via php (following post/redirect/get-pattern)\n__prg() // to current url without get arguments\n__prg('https://test.de')\n\n// redirect via php/html\n__redirect_to() // to current url without get arguments\n__redirect_to('https://test.de')\n__redirect_to('https://test.de', 301) // with \"Moved permanently\"\n__redirect_to('https://test.de', 302) // with \"Moved temporarily\"\n__redirect_to('https://test.de', 7, 'html') // redirect in 7 seconds (via html)\n\n// show system messages\n// -- in your controller\nsystem_message('foo')\nsystem_message('bar', 'error')\n// -- in your view\n$system_messages = system_messages(); // must be before any output\necho '\u003c!DOCTYPE html\u003e\u003chtml lang=\"de\"\u003e\u003cbody\u003e';\nforeach ($system_messages as $system_messages__value) {\n    echo '\u003cdiv class=\"system-message system-message--'.$system_messages__value-\u003etype.'\"\u003e';\n    echo $system_messages__value-\u003econtent;\n    echo '\u003c/div\u003e';\n}\necho '\u003c/body\u003e\u003c/html\u003e';\n\n// throw exceptions (with arrays as messages)\ntry {\n    __exception('foo');\n}\ncatch(\\Throwable $t) {\n     __exception_message($t) // 'foo'\n}\ntry {\n    __exception(['foo' =\u003e 'bar']);\n}\ncatch(\\Throwable $t) {\n    __exception_message($t) // ['foo' =\u003e 'bar']\n}\ntry {\n    throw new \\Exception('bar');\n}\ncatch(\\Throwable $t) {\n    __exception_message($t) // 'bar'\n}\n// you also catch these specific exceptions only\ntry {\n    __exception('foo');\n}\ncatch(\\ExtendedException $t) {\n    __exception_message($t) // 'foo'\n}\ntry {\n    throw new \\Exception('bar');\n}\ncatch(\\ExtendedException $t) {\n    // does not trigger\n}\ncatch(\\Exception $t) {\n    // triggers\n}\n\n// success/error return values\n__success() // { success: true, message: '' }\n__error('missing data') // { success: false, message: 'missing data' }\n\n// simple hook system that supports actions/filters with priorities\n$GLOBALS['t'] = 0;\n__hook_fire('hook_name'); // $GLOBALS['t'] = 0\n__hook_add('hook_name', function() { $GLOBALS['t']++; }); // $GLOBALS['t'] = 0\n__hook_fire('hook_name'); // $GLOBALS['t'] = 1\n__hook_fire('hook_name'); // $GLOBALS['t'] = 2\n__hook_add('hook_name', function() { $GLOBALS['t'] *= 2; }); // $GLOBALS['t'] = 2\n__hook_fire('hook_name'); // $GLOBALS['t'] = 6\n__hook_fire('hook_name'); // $GLOBALS['t'] = 14\n$foo = 1;\n__hook_add('filter_name', function($a) { return $a+1; }, 20);\n__hook_add('filter_name', function($a) { return $a*2; }, 10);\n__hook_add('filter_name', function($a) { return $a-3; }, PHP_INT_MAX);\n$foo = __hook_fire('filter_name', $foo); // $foo = 0\n$foo = __hook_fire('filter_name', $foo); // $foo = -2\n\n// get current os\n__os() // ['windows','mac','linux']\n\n// get current url (without trailing slash)\n__url()                 // https://tld.com/foo/bar/baz.php?foo=bar (with get parameters)\n__urlWithoutArgs()      // https://tld.com/foo/bar/baz.php (without get parameters)\n__baseurl()             // https://tld.com\n__baseurl(true)         // https://tld.com/foo/bar\n\n// compress image\n__image_compress('input.jpg')\n__image_compress('input.jpg', 70)\n__image_compress('input.jpg', 70, 'output.jpg')\n\n// fix exif image orientation\n__image_orientate('input.jpg')\n__image_orientate('input.jpg', 70)\n__image_orientate('input.jpg', 70, 'output.jpg')\n\n// get file extension from filename\n__file_extension('foo.jpg') // jpg\n\n// utf8 conversions\n__is_utf8('foo') // true; checks if a string is utf8 encoded\n__to_utf8('foo') // tries to convert any string to utf8\n\n// drop-in replacements for deprecated utf8_encode/utf8_decode\n__utf8_encode('foo')\n__utf8_decode('foo')\n\n// read/write iptc tags (with full utf8 support)\n__iptc_codes() // returns important codes in human readable format: ['2#116' =\u003e 'Copyright', ...]\n__iptc_code('Copyright') // 2#116\n__iptc_keyword('2#116') // Copyright\n\n__iptc_read('input.jpg') // ['2#116' =\u003e '© Copyright 2021 by foobar', ...]\n__iptc_read('input.jpg', '2#116') // '© Copyright 2021 by foobar\n__iptc_read('input.jpg', 'Copyright') // '© Copyright 2021 by foobar\n\n__iptc_write('input.jpg', ['2#116' =\u003e '© Copyright 2021 by foobar']) // this overwrites all existing data and only sets one field\n__iptc_write('input.jpg', '2#116', '© Copyright 2021 by foobar') // this only sets the specific field and leaves the rest intact\n__iptc_write('input.jpg', 'Copyright', '© Copyright 2021 by foobar') // also accepts human readable codes\n__iptc_write('input.jpg', 'Copyright', null) // delete specific tag\n__iptc_write('input.jpg', []) // reset all tags\n\n// poor mans encryption (via openssl)\ndefine('ENCRYPTION_KEY', '4736d52f85bdb63e46bf7d6d41bbd551af36e1bfb7c68164bf81e2400d291319')  // first define your encryption key (generated with hash('sha256', uniqid(mt_rand(), true)))\n__decrypt(__encrypt('foo')) // 'foo' (hard, with individual one-time salt)\n__decrypt(__encrypt('bar','known_salt')) // 'bar' (soft, good for searching in dbs)\n\n// very poor mans encryption (via file system)\ndefine('ENCRYPTION_FOLDER', $_SERVER['DOCUMENT_ROOT'].'/encryption') // Deny from all this if this is public(!)\n__decrypt_poor(__encrypt_poor('foo')) // 'foo'\n$token = __encrypt_poor('bar')\n__decrypt_poor($token, true) // 'bar' (one time decryption supported)\n__decrypt_poor($token) // null\n\n// list all files in folder (['filename1','filename2',...])\n__files_in_folder() // current folder\n__files_in_folder('.') // current folder\n__files_in_folder('foo') // subfolder\n__files_in_folder('foo', true) // do it recursively\n__files_in_folder('foo', true, ['.git', '.gitkeep']) // do it recursively and exclude some folders/files\n__files_in_folder('foo', true, ['.git', '.gitkeep'], true) // get absolute instead of relative paths\n\n// recursively remove folder and it's contents\n__rrmdir('foo')\n\n// zip/unzip\n__zip('output.zip', 'folder')\n__zip('output.zip', 'file1.jpg')\n__zip('output.zip', ['file1.jpg', 'subfolder/file2.jpg'])\n__zip('output.zip', ['file1.jpg', 'subfolder/file2.jpg'], true) // strips paths\n__unzip('output.zip', '.')\n\n// check if link is external or internal\n__is_external('https://github.com/vielhuber/stringhelper') // false\n__is_external('https://github.com/vielhuber/stringhelper/') // false\n__is_external('https://github.com/vielhuber/stringhelper/issues') // false\n__is_external('https://github.com/vielhuber/stringhelper/test.pdf') // true\n__is_external('tel:+4989215400142') // false\n__is_external('mailto:david@vielhuber.de') // false\n__is_external('https://vielhuber.de') // true\n__is_external('https://vielhuber.de/test.pdf') // true\n\n$_GET = ['page_id' =\u003e '13', 'code' =\u003e '\u003ch1\u003eHello World!\u003c/h1\u003e'];\n$_POST = ['foo' =\u003e 'bar', 42 =\u003e \"\\0\"];\n\n// fetch post/get variables if they exist\n__get('foo') // null (because not set)\n__get('page_id') // '13'\n__post('foo') // bar\n\n// filter get parameters from url\n__filter_url_args('https://ai?foo=bar\u0026bar=baz\u0026baz=foo', ['foo','bar']) // https://ai?baz=foo\n\n// clean up post/get from malicious content using filter_var_array\n__clean_up_get() // $_GET = ['page_id' =\u003e '13', 'code' =\u003e 'Hello World!']\n__clean_up_post() // $_POST = ['foo' =\u003e 'bar', 42 =\u003e '']\n__clean_up() // same as __clean_up_get() and __clean_up_post()\n\n// read .env file (poor mans version)\n__read_env('.env') // ['foo' =\u003e 'bar', 'bar' =\u003e 'baz']\n\n// check for repetitive actions, e.g. to prevent mass spam mailing (based on hashed client ip address)\n__is_repetitive_action(); // any action\n__is_repetitive_action('name'); // specific action\n__is_repetitive_action('name', 60); // allow 1 action per 60 minutes (this is the default if not specified)\n__is_repetitive_action('name', 1/60); // allow 1 action per 1 second\n__is_repetitive_action('name', 60, ['127.0.0.1','0.0.0.0']); // whitelist ip addresses\n\n// check for spam words in string (blacklist blocker utilizing https://github.com/splorp/wordpress-comment-blacklist)\n__has_spamwords('This is cool stuff.') // false\n__has_spamwords('I do spy software your website.') // true\n__has_spamwords('Hongsheng Ltd') // false\n__has_spamwords('Hongsheng Ltd', ['hongsheng']) // true (add custom blacklist keywords)\n__has_spamwords('I do spy software your website.', null, ['spy software']) // false (add custom whitelist keywords)\n\n// check if ip is blacklisted on multiple dnsbls (dns based blackhole lists)\n__ip_is_on_spamlist('191.101.31.148') // true\n__ip_is_on_spamlist('127.0.0.1') // false\n\n// get referrer\n__referer() // $_SERVER['HTTP_REFERER'], if not available null\n\n// do simple get requests (via curl or as a fallback with php file_get_contents [allow_url_fopen=1])\n__fetch('https://httpbin.org/anything') // { \"method\": \"GET\", ... }\n__fetch('https://httpbin.org/anything', 'curl') // { \"method\": \"GET\", ... }\n__fetch('https://httpbin.org/anything', 'php') // { \"method\": \"GET\", ... }\n\n// do curl requests (get/post) and get status code, body and header\n__curl(\n    'https://httpbin.org/anything', // url\n    ['foo' =\u003e 'bar'], // data\n    'POST', // method\n    ['Bar' =\u003e 'baz'], // headers\n    false, // store and send cookies\n    true, // send as json (or application/x-www-form-urlencoded)\n    60, // timeout in seconds\n    ['username' =\u003e 'password'], // basic authentication\n    ['foo' =\u003e 'bar'], // cookies\n    true, // follow redirects\n    'username:password@192.168.178.1:8080' // use proxy (username, password and port are optional)\n)\n__curl('https://httpbin.org/anything') // {\"status\": 200, \"result\": { \"method\": \"GET\", ... }, \"headers\": [ ... ], \"url\": \"...\"}\n__curl('https://httpbin.org/anything', ['foo' =\u003e 'bar'], 'POST') //  {\"status\": 200, \"result\": { \"method\": \"POST\", \"data\": {\"foo\": \"bar\"}, ... }, \"headers\": [ ... ], \"url\": \"...\"}\n__curl('https://httpbin.org/anything', ['foo' =\u003e 'bar'], 'POST', ['Bar' =\u003e 'baz']) //  {\"status\": 200, \"result\" =\u003e { \"method\": \"POST\", \"headers\" = { \"Bar\": \"baz\", ... }, ... }, \"headers\": [ ... ], \"url\": \"...\"}\n__curl('https://vielhuber.de') // json is automatically decoded (but only if the response is of type json)\n__curl('https://httpbin.org/anything', ['foo' =\u003e 'bar'], 'PUT') //  {\"status\": 200, \"result\": { \"method\": \"PUT\", \"data\": {\"foo\": \"bar\"}, ... }, \"headers\": [ ... ], \"url\": \"...\"}\n__curl('https://httpbin.org/anything', null, 'DELETE') //  {\"status\": 200, \"result\": { \"method\": \"DELETE\", \"data\": \"\", ... }, \"headers\": [ ... ], \"url\": \"...\"}\n// __curl also supports both storing and sending cookies (without leaving a trace on the local filesystem)\n// with that you can do cool stuff like scraping the wordpress backend\n__curl('https://vielhuber.de/wp-login.php', ['log' =\u003e 'username', 'pwd', 'password'], 'POST', null, true, false)\n__curl('https://vielhuber.de/wp-admin/options.php', null, 'GET', null, true)\n// you can also hijack the current browser session if logged in\n__curl('https://vielhuber.de/wp-admin/options.php', null, 'GET', null, false, false, 60, null, $_COOKIE)\n\n// mime type\n__get_mime_type('foo.png') // image/png\n__mime_type_to_extension('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') // 'xlsx'\n__extension_to_mime_types('xlsx') // ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel']\n\n// reverse proxy\n__reverse_proxy('https://tld.com', [\n    '*' =\u003e [\n        'replacements' =\u003e [\n            ['location.origin!==n.origin', '1===0\u0026\u0026location.origin!==n.origin'], /* simple replacements (like origin checks) */\n            ['/(https:\\/\\/.+\\.example\\.net\\/assets\\/js\\/another\\/asset.js)/', __urlWithoutArgs().'?url=$1'], /* regex is also possible */\n            ['\u003c/head\u003e', '\u003cstyle\u003e.ads { display:none; }\u003c/style\u003e\u003c/head\u003e'] /* dirty inject */\n        ],\n        'dom' =\u003e function($DOMDocument, $DOMXPath) {\n            $DOMXPath-\u003equery('/html/body//*[@id=\"foo\"]')[0]-\u003esetAttribute('data-bar','baz');\n        },\n        'css' =\u003e '.ads { display:none; }',\n        'js' =\u003e 'alert(\"ok\");'\n    ],\n    'example.js' =\u003e [/*...*/],\n    '/regex-match-v.*\\.js/' =\u003e [/*...*/]\n])\n// full example\nrequire_once(__DIR__ . '/vendor/autoload.php');\nif( !isset($_GET['url']) ) {\n    echo '\u003c!DOCTYPE html\u003e\u003chead\u003e\u003ctitle\u003eproxy test\u003c/title\u003e\u003c/head\u003e\u003cbody\u003e\n        \u003ciframe src=\"'.__urlWithoutArgs().'?url=https://www.wikipedia.org/\" height=\"800\" width=\"600\"\u003e\u003c/iframe\u003e\n    \u003c/body\u003e\u003c/html\u003e';\n}\nelse {\n    __reverse_proxy($_GET['url'], [\n        '*' =\u003e [\n            'replacements' =\u003e [\n                ['/(\\/static|portal\\/)/', __urlWithoutArgs().'?url=https://wikipedia.org/$1'],\n            ],\n            'dom' =\u003e function($DOMDocument, $DOMXPath) {\n                $el = $DOMDocument-\u003ecreateElement('marquee', '');\n                $el-\u003enodeValue = 'Hello world.';\n                $DOMXPath-\u003equery('/html/body//*[@id=\"js-lang-list-button\"]')[0]-\u003eappendChild($el);\n            },\n            'css' =\u003e '.pure-button { box-shadow: 0px 0px 20px 20px #f800ff }',\n            'js' =\u003e 'alert(\"proxied!\");'\n        ],\n        '/l10n\\/.+\\.json/' =\u003e [\n            'replacements' =\u003e [\n                ['Die freie Enzyklop\\u00e4die', 'Die coole Enzyklop\\u00e4die']\n            ],\n        ]\n    ]);\n}\n\n// check basic auth\n__has_basic_auth('https://vielhuber.de'); // false\n__has_basic_auth('https://httpbin.org/basic-auth/foo/bar'); // true\n__check_basic_auth('https://httpbin.org/basic-auth/foo/bar', 'foo','baz'); // false\n__check_basic_auth('https://httpbin.org/basic-auth/foo/bar', 'foo','bar'); // true\n\n// output json response with status code for apis\n__json_response([\n    'success' =\u003e true,\n    'message' =\u003e 'successfully created object',\n    'public_message' =\u003e 'Object erfolgreich angelegt!',\n    'data' =\u003e [\n        'id' =\u003e 42,\n        'foo' =\u003e 'bar'\n    ],\n    200 // status code\n]);\n\n// get input on backend (from x-www-form-urlencoded, application/json, ...)\n__input();\n__input('specific-field');\n__input('unknown-field', 'fallback');\n\n// extract all urls of (potentially nested) remote sitemap\n__extract_urls_from_sitemap('https://vielhuber.de/sitemap_index.xml') // ['https://vielhuber.de','https://vielhuber.de/impressum/', ...]\n__extract_urls_from_sitemap('https://foo:bar@vielhuber.de/sitemap_index.xml') // supports basic auth\n__extract_urls_from_sitemap('https://vielhuber.de/sitemap_index.xml', 'foo:bar')\n__extract_urls_from_sitemap('https://vielhuber.de/sitemap_index.xml', null, true) // include lastmod parameter; [['url' =\u003e 'https://vielhuber.de', 'lastmod' =\u003e '2020-01-01 00:00:00'], ['url' =\u003e 'https://vielhuber.de/impressum/', 'lastmod' =\u003e '2020-01-01 00:00:00'], ...]\n\n// get meta tags from url\n__extract_title_from_url('https://vielhuber.de') // David Vielhuber \u003e Full-Stack Developer aus München\n__extract_meta_desc_from_url('https://vielhuber.de') // 🌀 Vielhuber David ist ein Web-Geek mit einem Faible für schönes Design, einer Prise Perfektionismus und Augen für klare Konturen. 🌀\n\n// extract youtube/vimeo video information from string\n__video_info('https://www.youtube.com/watch?v=WAZlcK7FUic') // ['id' =\u003e 'WAZlcK7FUic', 'provider' =\u003e 'youtube', 'thumbnail' =\u003e 'data:image/jpeg;base64,/9j/4AA...']\n__video_info('https://vimeo.com/527316428') // ['id' =\u003e '527316428', 'provider' =\u003e 'vimeo', 'thumbnail' =\u003e 'data:image/jpeg;base64,/9j/4AA...']\n__video_info('https://www.youtube.com/embed/WAZlcK7FUic?feature=oembed') // several different formats are accepted\n__video_info('WAZlcK7FUic')\n__video_info('527316428')\n__video_info('https://www.youtube.com/watch?v=WAZlcK7FUiZ') // null (strong id detection is also included)\n\n// char helpers for excel columns\n__char_to_int('D') // 4\n__int_to_char(4) // 'D'\n__inc_char('D') // 'E'\n__inc_char('Z') // 'AA'\n__inc_char('A',2) // 'C'\n__dec_char('U') // 'T'\n\n// convert excel date timestamp to string and vice versa (be aware: excel does utc internally)\n__timestamp_excel_to_str(36526) // '2000-01-01 00:00:00'\n__timestamp_excel_to_str(36526.3440972222) // '2000-01-01 08:15:30'\n__timestamp_str_to_excel('01.01.2000') // 36526\n__timestamp_str_to_excel('01.01.2000 08:15:30') // 36526.3440972222\n\n// str_replace\n__str_replace_first('foo','bar','foofoo') // 'barfoo'\n__str_replace_last('foo','bar','foofoo') // 'foobar'\n\n// search/replace with regex\n__str_search_replace(\n    '\n    foo_1_bar_2_baz_3_gnarr_4_gnaz\n    foo_5_bar_6_baz_7_gnarr_8_gnaz\n    foo_9_bar_10_baz_11_gnarr_12_gnaz\n    ',\n    '/foo_(.+)_bar_(?:.+)_baz_(.+)_gnarr_(.+)_gnaz/'\n    ,\n    function($matches) {\n        $matches[0]++;\n        $matches[1]++;\n        $matches[2]++;\n        return $matches;\n    }\n)\n/*\nfoo_2_bar_2_baz_4_gnarr_5_gnaz\nfoo_6_bar_6_baz_8_gnarr_9_gnaz\nfoo_10_bar_10_baz_12_gnarr_13_gnaz\n*/\n\n// fun with line endings\n__line_endings_convert($str, 'linux') // converts string to linux line endings (LF)\n__line_endings_convert($str, 'mac') // converts string to mac line endings (CR)\n__line_endings_convert($str, 'windows') // converts string to windows line endings (CRLF)\n__line_endings_weak_equals($str1, $str2) // compares 2 strings ignoring its line endings\n\n// inline text modifications using sed (also works on sed bsd)\n__sed_replace(['foo' =\u003e 'bar', 'bar' =\u003e 'baz', 'gna' =\u003e 'gnarr'], 'file.txt')\n__sed_prepend('foo', 'file.txt')\n__sed_append('bar', 'file.txt')\n\n// show diff of two strings\n__diff('foo\nbar\nbaz', 'foo\nbarz\nbaz')\n// 2c2\n// \u003c bar\n// ---\n// \u003e barz\n\n// csv fun\n__array2csv([['foo', 'bar', 'baz'],['foo', 'bar', 'baz']], 'file.csv')\n__array2csv([['foo', 'bar', 'baz'],['foo', 'bar', 'baz']], 'file.csv', ';', '\"')\n__csv2array('file.csv') // [['foo', 'bar', 'baz'],['foo', 'bar', 'baz']]\n__csv2array('file.csv', ';', '\"') // [['foo', 'bar', 'baz'],['foo', 'bar', 'baz']]\n\n// xml fun\n$arr = [\n    [\n        'tag' =\u003e 'tag1',\n        'attrs' =\u003e ['attr1' =\u003e 'val1', 'attr2' =\u003e 'val2'],\n        'content' =\u003e [\n            [\n                'tag' =\u003e 'tag2',\n                'attrs' =\u003e ['attr3' =\u003e 'val3', 'attr4' =\u003e 'val4'],\n                'content' =\u003e 'äöüß'\n            ],\n            [\n                'tag' =\u003e 'tag3',\n                'attrs' =\u003e ['attr5' =\u003e 'val5', 'attr5' =\u003e 'val5'],\n                'content' =\u003e [\n                    [\n                        'tag' =\u003e 'tag4',\n                        'attrs' =\u003e ['attr6' =\u003e 'val6', 'attr7' =\u003e 'val7'],\n                        'content' =\u003e 'äöüß'\n                    ]\n                ]\n            ]\n        ]\n    ]\n];\n$xml = '\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n    \u003ctag1 attr1=\"val1\" attr2=\"val2\"\u003e\n        \u003ctag2 attr3=\"val3\" attr4=\"val4\"\u003eäöüß\u003c/tag2\u003e\n        \u003ctag3 attr5=\"val5\"\u003e\n            \u003ctag4 attr6=\"val6\" attr7=\"val7\"\u003eäöüß\u003c/tag4\u003e\n        \u003c/tag3\u003e\n    \u003c/tag1\u003e\n';\n__array2xml($arr); // $xml\n__array2xml($arr, 'file.xml'); // directly save to file\n__array2xml($arr, null, ['version' =\u003e '1.1']); // manually modify prolog attributes\n__array2xml($arr, null, null, true); // strip empty tags\n__xml2array('file.xml'); // $arr\n\n// measure performance\n__log_begin()\nfor($i = 0; $i \u003c 10000; $i++) { }\n__log_end() // echos script execution time\n\n__log_begin('task')\nfor($i = 0; $i \u003c 10000; $i++) { }\n$data = __log_end('task', false) // ['message' =\u003e '...', 'time' =\u003e '...'];\n\n__log_begin('task')\nfor($i = 0; $i \u003c 10000; $i++) {\n  __log_begin('childtask')\n  for($y = 0; $y \u003c 100; $y++) { }\n  __log_end('childtask')\n}\n__log_end('task')\n\n__log_begin('task1')\n__log_begin('task2')\n__log_end('task1')\n__log_end('task2')\n\n__log_begin()\n__log_begin()\n__log_end() // this ends latest entry (lifo)\n__log_end()\n```\n\n## usage as class\n\nif you don't like hotloaded functions, you also can use this library in a class-based way:\n\n```php\nuse vielhuber\\stringhelper\\__;\n__::x(42); // true\n```\n\n## js implementation\n\nthere is also a javascript implemenation [hlp](https://github.com/vielhuber/hlp) with similiar functions available.\n\n## testing\n\ncopy `.env.example` to `.env`, fill in values, install dependencies with `composer install` and run `./vendor/bin/phpunit`.\n\n## appendix\n\n### existence matrix\n\n|                                 | \u003csub\u003e\\_\\_x()\u003c/sub\u003e | \u003csub\u003e\\_\\_true()\u003c/sub\u003e | \u003csub\u003e\\_\\_false()\u003c/sub\u003e | \u003csub\u003e!== null\u003c/sub\u003e | \u003csub\u003e!= null\u003c/sub\u003e | \u003csub\u003e!== false\u003c/sub\u003e | \u003csub\u003e!= false\u003c/sub\u003e | \u003csub\u003e=== true\u003c/sub\u003e | \u003csub\u003e== true\u003c/sub\u003e | \u003csub\u003e!is_null()\u003c/sub\u003e | \u003csub\u003eisset()\u003c/sub\u003e | \u003csub\u003e!empty()\u003c/sub\u003e | \u003csub\u003eif/else\u003c/sub\u003e | \u003csub\u003e?true:false\u003c/sub\u003e | \u003csub\u003e(??true) === true\u003c/sub\u003e | \u003csub\u003e(??true) == true\u003c/sub\u003e | \u003csub\u003e(??true) === false\u003c/sub\u003e | \u003csub\u003e(??true) == false\u003c/sub\u003e | \u003csub\u003ecount() \u003e 0\u003c/sub\u003e | \u003csub\u003e!= ''\u003c/sub\u003e | \u003csub\u003e!== ''\u003c/sub\u003e |\n| ------------------------------- | ------------------ | --------------------- | ---------------------- | ------------------- | ------------------ | -------------------- | ------------------- | ------------------- | ------------------ | --------------------- | ------------------ | ------------------- | ------------------ | ---------------------- | ---------------------------- | --------------------------- | ----------------------------- | ---------------------------- | ---------------------- | ---------------- | ----------------- |\n| \u003csub\u003enull\u003c/sub\u003e                 | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e              | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003efalse\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e            | \u003csub\u003etrue\u003c/sub\u003e               | \u003csub\u003etrue\u003c/sub\u003e              | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003etrue\u003c/sub\u003e                 | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e              | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e[]\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e            | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e['']\u003c/sub\u003e                 | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e0\u003c/sub\u003e                    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e            | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e1\u003c/sub\u003e                    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e-1\u003c/sub\u003e                   | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'0'\u003c/sub\u003e                  | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e            | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'1'\u003c/sub\u003e                  | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'-1'\u003c/sub\u003e                 | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e''\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e            | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  |\n| \u003csub\u003e' '\u003c/sub\u003e                  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'null'\u003c/sub\u003e               | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'false'\u003c/sub\u003e              | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'true'\u003c/sub\u003e               | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'str'\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e[0,1]\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e[0]\u003c/sub\u003e                  | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'a:0:{}'\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'b:1;'\u003c/sub\u003e               | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e'b:0;'\u003c/sub\u003e               | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003enew stdClass\u003c/sub\u003e         | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e        | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   |\n| \u003csub\u003e$\\_GET['undefined']\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e      | \u003csub\u003eerror\u003c/sub\u003e       | \u003csub\u003eerror\u003c/sub\u003e    | \u003csub\u003eerror\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e     | \u003csub\u003eerror\u003c/sub\u003e    | \u003csub\u003eerror\u003c/sub\u003e    | \u003csub\u003eerror\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003eerror\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003eerror\u003c/sub\u003e       | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e  |\n| \u003csub\u003e@$\\_GET['undefined']\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e      | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003etrue\u003c/sub\u003e              | \u003csub\u003etrue\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e             | \u003csub\u003efalse\u003c/sub\u003e       | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e   |\n\n### loose comparison matrix\n\n| \u003csub\u003e==\u003c/sub\u003e                    | \u003csub\u003enull\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003e[]\u003c/sub\u003e    | \u003csub\u003e['']\u003c/sub\u003e  | \u003csub\u003e0\u003c/sub\u003e     | \u003csub\u003e1\u003c/sub\u003e     | \u003csub\u003e-1\u003c/sub\u003e    | \u003csub\u003e'0'\u003c/sub\u003e   | \u003csub\u003e'1'\u003c/sub\u003e   | \u003csub\u003e'-1'\u003c/sub\u003e  | \u003csub\u003e''\u003c/sub\u003e    | \u003csub\u003e' '\u003c/sub\u003e   | \u003csub\u003e'null'\u003c/sub\u003e | \u003csub\u003e'false'\u003c/sub\u003e | \u003csub\u003e'true'\u003c/sub\u003e | \u003csub\u003e'str'\u003c/sub\u003e | \u003csub\u003e[0,1]\u003c/sub\u003e | \u003csub\u003e[0]\u003c/sub\u003e   | \u003csub\u003e'a:0:{}'\u003c/sub\u003e | \u003csub\u003e'b:1;'\u003c/sub\u003e | \u003csub\u003e'b:0;'\u003c/sub\u003e | \u003csub\u003enew stdClass\u003c/sub\u003e | \u003csub\u003e\\$\\_GET['undefined']\u003c/sub\u003e | \u003csub\u003e@\\$\\_GET['undefined']\u003c/sub\u003e |\n| -------------------------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ----------------- | ------------------ | ----------------- | ---------------- | ---------------- | ---------------- | ------------------- | ----------------- | ----------------- | ----------------------- | ------------------------------- | -------------------------------- |\n| \u003csub\u003enull\u003c/sub\u003e                  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n| \u003csub\u003efalse\u003c/sub\u003e                 | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n| \u003csub\u003etrue\u003c/sub\u003e                  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e         | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e[]\u003c/sub\u003e                    | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n| \u003csub\u003e['']\u003c/sub\u003e                  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e0\u003c/sub\u003e                     | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n| \u003csub\u003e1\u003c/sub\u003e                     | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e-1\u003c/sub\u003e                    | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'0'\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'1'\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'-1'\u003c/sub\u003e                  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e''\u003c/sub\u003e                    | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n| \u003csub\u003e' '\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'null'\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'false'\u003c/sub\u003e               | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'true'\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'str'\u003c/sub\u003e                 | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e[0,1]\u003c/sub\u003e                 | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e[0]\u003c/sub\u003e                   | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'a:0:{}'\u003c/sub\u003e              | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e     | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'b:1;'\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e'b:0;'\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003enew stdClass\u003c/sub\u003e          | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e         | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003efalse\u003c/sub\u003e                 |\n| \u003csub\u003e\\$\\_GET['undefined']\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e   | \u003csub\u003eerror\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e | \u003csub\u003eerror\u003c/sub\u003e    | \u003csub\u003eerror\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e  | \u003csub\u003eerror\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003eerror\u003c/sub\u003e                 |\n| \u003csub\u003e@\\$\\_GET['undefined']\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003etrue\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e   | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e | \u003csub\u003efalse\u003c/sub\u003e    | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e  | \u003csub\u003efalse\u003c/sub\u003e        | \u003csub\u003eerror\u003c/sub\u003e                | \u003csub\u003etrue\u003c/sub\u003e                  |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvielhuber%2Fstringhelper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvielhuber%2Fstringhelper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvielhuber%2Fstringhelper/lists"}