php-helper is a package full of helper functions I found useful when developing applications in PHP. All functions are wrapped with a functions_exists()
in case of conflicts.
⚠️ Some of these functions used to be inrepat/laravel-helper
, which now has this package as a dependency.
Also have a look at
- https://laravel.com/docs/8.x/helpers
- http://calebporzio.com/11-awesome-laravel-helper-functions
- https://packagist.org/packages/illuminated/helper-functions
- https://packagist.org/packages/laravel/helper-functions
Ideas what should go in here? Write a pull request or email!
$ composer require repat/php-helper
Determines if 2 arrays have the same items, independent of order.
$arr1 = [1, 2, 3];
$arr2 = [3, 2, 1];
array_equal($arr1, $arr2);
// returns: true
$arr3 = [4, 5, 6];
array_equal($arr1, $arr3);
// returns: false
Returns an array where key == value. Syntactic sugar for array_combine($array, $array);
$array = [1, 3, 5];
print_r(array_key2value($array));
// returns: Array( [1] => 1, [3] => 3, [5] => 5 )
Deletes all elements from $array
that have value $value
. Essentially syntactic sugar for array_diff()
.
$array = ['foo', 'bar'];
print_r(array_delete_value($array, 'foo'));
// returns Array( [1] => "bar" )
Checks if there are duplicates in given array.
contains_duplicates([1, 1]);
// returns: true
contains_duplicates([1, 2]);
// returns: false
Changes the keys recursively for an associative array. The second parameter is an array with the old key (of $array
) as the key and the new key as the value.
$array = [
'bar' => 'foo',
'sub' => [
'some' => 'thing',
],
];
$keys = [
'bar' => 'biz', // change all 'bar' keys to 'biz' keys
'some' => 'any',
];
array_change_keys($array, $keys);
// returns:[
// 'biz' => 'foo',
// 'sub' => [
// 'any' => 'thing',
// ],
// ];
Similar to array_change_keys()
but it only works for one-dimensional arrays.
array_key_replace(['bar' => 'foo'], 'bar', 'bizz');
// returns : ['bizz' => 'foo']
Calculates average (sum/amount) of values. Returns null
if array is empty.
array_avg([1, 2, 3]);
// returns : 2
array_avg([]);
// returns : null
Returns amount of days in given month or year. Defaults to current month and year.
days_in_month();
// returns: 31 (for e.g. May)
days_in_month($april = 4);
// returns: 30
days_in_month($feb = 2, $year = 2020);
// returns: 29 (2020 is a leap year)
Returns amount of days of the current month.
days_this_month();
// returns: 31 (for e.g. May)
Returns amount of days of the next month.
days_next_month();
// returns: 30 (for e.g. May because June has 30)
Returns amount of days of the current year.
days_this_year();
// returns: 365 (because it's not a leap year)
Returns amount of days left in current month.
days_left_in_month();
// returns: 29 (on 1st April)
Returns amount of days left in current year.
days_left_in_year();
// returns: 274 (on 1st April 2019)
Returns a list of all timezones.
timezone_list();
// returns:
// [
// "Pacific/Pago_Pago" => "(UTC-11:00) Pacific/Pago_Pago",
// "Pacific/Niue" => "(UTC-11:00) Pacific/Niue",
// "Pacific/Midway" => "(UTC-11:00) Pacific/Midway",
// ...
// "Pacific/Chatham" => "(UTC+13:45) Pacific/Chatham",
// "Pacific/Kiritimati" => "(UTC+14:00) Pacific/Kiritimati",
// "Pacific/Apia" => "(UTC+14:00) Pacific/Apia",
// ];
Similar to today()
or now()
, this function returns a Carbon instance for tomorrow.
tomorrow();
// returns: Carbon\Carbon @1554156000 {#5618
// date: 2019-04-20 00:00:00.0 Europe/Amsterdam (+02:00),
// }
Similar to today()
or now()
, this function returns a Carbon instance for yesterday.
yesterday();
// returns: Carbon\Carbon @1554156000 {#5618
// date: 2019-04-19 00:00:00.0 Europe/Amsterdam (+02:00),
// }
Returns i:s
string with 60+ minutes instead of showing the hours as well.
seconds2minutes(42);
// returns: 00:42
seconds2minutes(90);
// returns: 01:30
seconds2minutes(4223);
// returns: 70:23
Uses Carbons diffInDays()
and parse()
methods to return the difference in days.
diff_in_days('2018-04-19', '2018-04-21');
// returns: 2
diff_in_days(today(), yesterday());
// returns: 1
Array representation of an object, e.g. an Eloquent Model.
use App\Models\User;
object2array(User::first());
// returns: [
// "casts" => [
// "someday_at" => "datetime",
// // ...
// ],
// "incrementing" => true,
// "exists" => true,
// "wasRecentlyCreated" => false,
// "timestamps" => true,
// ]
Will turn a filepath into a Fully Qualified Class Name.
filepath2fqcn('/Users/john/code/app/Models/User.php', '/Users/john/code/');
// returns: App\Models\User
filepath2fqcn('/Users/john/code/app/Models/User.php', '/Users/john/code');
// returns: App\Models\User
filepath2fqcn('app/Models/User.php');
// returns: App\Models\User
filepath2fqcn('/Users/john/code/app/Models/User.php');
// returns: \Users\john\code\app\Models\User
If given true
, returns false
and vice-versa.
toggle(false);
// returns: true
toggle(true);
// returns: false
Returns a random password. Syntactic sugar for str_random()
.
generate_password();
// returns: IZeJx3MeUdDhzE2
Returns the value with the right type so e.g. you can compare type safe with ===
.
gettype(auto_cast('42'));
// returns: integer
gettype(auto_cast('42.0'));
// returns: double
gettype(auto_cast('true'));
// returns: boolean
Returns a human readable form for given bytes. Goes up to Yottabyte.
human_filesize(4223);
// returns: 4.12kB
Returns a generator with all possible permutations of given array values.
Based on eddiewoulds port port of python code.
$gen = permutations(['foo', 'bar', 'biz']);
iterator_to_array($gen)
// returns: [
// [
// "foo",
// "bar",
// "biz",
// ],
// [
// "foo",
// "biz",
// "bar",
// ],
// [
// "bar",
// "foo",
// "biz",
// ],
// [
// "bar",
// "biz",
// "foo",
// ],
// [
// "biz",
// "foo",
// "bar",
// ],
// [
// "biz",
// "bar",
// "foo",
// ],
// ]
Wrapper around magic numbers for the Zenith. The types can be:
astronomical
: 108.0nautical
: 102.0civil
: 96.0- default: 90+50/60 (~90.83)
zenith('civil');
// returns: 96.0
Returns on of the following constants (also see under constants):
macos
windows
linux
bsd
operating_system();
// returns: linux
LINUX
// returns: linux
Link URL to wikipedia for a certain language
wikipedia('Towel Day');
// returns: https://en.wikipedia.org/wiki/Towel_Day
wikipedia('Paris', 'fr', '#')
// returns: https://fr.wikipedia.org/wiki/Paris
wikipedia('Pariz', 'fr', '#')
// returns: #
Uses Reflection to return the location where the function was defined or null
if function doesn't exist. Note that PHPs internal functions return a an empty string.
function_location('wikipedia')
// returns: /folder/on/drive/php-helper/src/misc_helper.php:198
function_location('function_does_not_exist')
// returns: null
function_location('array_map')
// returns: '' (empty string)
Removes the protocol, www and trailing slashes from a URL. You can then e.g. test HTTP vs. HTTPS connections.
scrub_url('https://www.repat.de/');
// returns: 'repat.de'
scrub_url('https://blog.fefe.de/?ts=a262bcdf');
// returns: 'blog.fefe.de/?ts=a262bcdf'
Returns just the status code by sending an empty request with curl. By default, it follows redirect so it will only return the last status code and not e.g. 301 Redirects. Disable following by setting the second parameter to false
. Some sites require a User-Agent and then return another status code. A string can be passed to $userAgent
.
Requires ext-curl
.
http_status_code('httpstat.us/500');
// returns: 500
http_status_code('http://repat.de'); // with 301 redirect to https://repat.de
// returns: 200
http_status_code('http://repat.de', false);
// returns: 301
Parses a HMAC signed request. Copied from Data Deletion Request Callback - Facebook for Developers. $algo
defaults to sha256
.
$requestString = null; // TODO
parse_signed_request($requestString, env('FACEBOOK_CLIENT_SECRET'));
Validates a domain and creates a slug. Does not work for subdomains, see sluggify_domain()
instead. Returns null
on a parsing error.
domain_slug('blog.fefe.de')
//returns: blogfefede
domain_slug('blogfefe.de')
//returns: blogfefede
Returns a IPv6 address for given domain by using the DNS AAAA records. If none is found, the input domain is returned, much like gethostbyname()
is doing for IPv4.
gethostbyname6('ipv4onlydomain.tld');
// returns: ipv4onlydomain.tld
gethostbyname6('example.com')
// returns: 2606:2800:220:1:248:1893:25c8:1946
Returns if given IP is a public IPv4 or IPv6 address (vs. private or reserved)
is_public_ip('127.0.0.1'); // localhost
// returns: false
is_public_ip('::1/128'); // localhost
// returns: false
is_public_ip('192.168.1.42') // private network
// returns: false
$ipv4 = gethostbyname('example.com');
is_public_ip($ipv4);
// returns: true
$ipv6 = gethostbyname6('example.com');
is_public_ip($ipv6);
// returns true;
Follows all 301/302 redirects and returns the URL at the end of the chain, or null
.
final_redirect_target('http://google.com');
// returns http://www.google.com
Similar to Str::contains() but case insensitive.
str_icontains('FOOBAR', 'foo');
// returns: true
str_icontains('foobar', 'foo');
// returns: true
str_icontains('foobar', 'FOO');
// returns: true
str_icontains('foobar', 'test');
// returns: false
Removes all non ASCII characters and returns the rest.
to_ascii('René');
// returns: Ren
Replaces all hyphen ("-") characters with underscore ("_")
hyphen2_('foo-bar');
// returns: foo_bar
Replaces all underscore ("_") characters with hyphen ("-")
_2hypen('foo_bar');
// returns: foo-bar
Same signature as str_replace()
, but as name suggests, replaces only the first occurrence of $search
.
str_replace_once('foo', 'bar', 'foofoo');
// returns: 'barfoo'
Title Case but without underscores.
title_case_wo_underscore('foo_bar');
// returns: Foo Bar
// vs.
// title_case('foo_bar')
// returns: Foo_Bar
Returns an example of the Lorem Ipsum placeholder text.
lorem_ipsum();
// returns:
// Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Returns a slug version of the domain by exchanging full stops with underscores. str_slug()
does not work with subdomains, as it removes full stops completely.
sluggify_domain('blog.fefe.de');
// returns: blog_fefe_de
str_slug('blog.fefe.de');
// returns: blogfefede
sluggify_domain('blogfefe.de');
// returns: blogfefe_de
str_slug('blogfefe.de');
// returns: blogfefede // same as subdomain on fefe.de
Removes given string(s), numbers or array of strings. Syntactic sugar for str_replace($remove, '', $string)
.
str_remove('foobar', 'bar');
// returns: foo
str_remove('foobar42', ['foo', 'bar']);
// returns: 42
str_remove('foobar42', 42);
// returns: foobar
Returns the amount of bytes in a string.
str_bytes('foobar');
// returns: 6
str_bytes('fooßar');
// returns: 8
Creates a string with regex for an OR separated list.
regex_list(['foo', 'bar', '42'])
// returns: \bfoo|\bbar|\b42
Decodes a base64-encoded URL. Copied from Data Deletion Request Callback - Facebook for Developers
base64_url_decode('aHR0cHM6Ly9yZXBhdC5kZQ==');
// returns: https://repat.de
Syntactic sugar for str_after
.
str_right('https://vimeo.com/165053513', '/');
// returns: 165053513
Syntactic sugar for str_before
.
str_left('https://vimeo.com/165053513', '165053513');
// returns: https://vimeo.com/
Normalizes all new lines characters (\r
, \n
, \r\n
) to the UNIX newline \n
.
normalize_nl('foobar\r\n'); // Windows
// returns: foobar\n
normalize_nl('foobar\r'); // MacOS
// returns: foobar\n
normalize_nl('foobar\n'); // *nix
// returns: foobar\n
Counts upper case characters in a string. See also str_count_lower()
.
str_count_upper('FoObAr');
// returns: 3
str_count_upper('foobar');
// returns: 0
str_count_upper('FOOBAR');
// returns: 6
Counts lower case characters in a string. See also str_count_upper()
.
str_count_lower('FoObAr');
// returns: 3
str_count_lower('foobar');
// returns: 6
str_count_lower('FOOBAR');
// returns: 0
Inserts bindings for ?
characters in the SQL string. See also insert_bindings()
of repat/laravel-helper
.
str_insert_bindings('SELECT * FROM `table` WHERE id = ?', [42]);
// returns: SELECT * FROM `table` WHERE id = '42'
If the given string contains at least one uppercase ASCII character.
contains_uppercase('Foobar');
// returns: true
contains_uppercase('foobar');
// returns: false
contains_uppercase('FOOBAR');
// returns: true
If the given string contains at least one lowercase ASCII character.
contains_lowercase('Foobar');
// returns: true
contains_lowercase('foobar');
// returns: true
contains_lowercase('FOOBAR');
// returns: false
If the given string (or number) contains at least one number.
contains_numbers('Foobar');
// returns: false
contains_numbers('Foobar42');
// returns: true
contains_numbers('42');
// returns: true
contains_numbers(42); // uses strval()
// returns: true
Converts ISO Code 3166-1 alpha-2 $iso
code into the full country name. Basically syntactic sugar for locale_get_display_region()
. Optionally accepts $locale
to print the country name in a given language. XK
will give you Kosovo.
country_name('nz');
// returns: New Zealand
country_name('de');
// returns: Germany (Germany in English)
country_name('de', 'de');
// returns: Deutschland (Germany in German)
These functions were pulled in from the Open Source Content Management System Wordpress, released under the GPL 2 (or later).
mbstring_binary_safe_encoding()
reset_mbstring_encoding()
seems_utf8()
Removes special characters and replaces them with their ASCII counterparts
remove_accents('á');
// returns: a
remove_accents('René')
// returns: Rene
Optional packages suggested by this are required for these functions to work.
Uses league/commonmark to transform Markdown into HTML.
$ composer require league/commonmark
markdown2html('# Header');
// returns: <h1>Header</h1>\n
Uses jeremykendall/php-domain-parser to return the domain only from a URL, removing protocol, subdomain (including www) and path. For that the package needs a public suffix list, which can be found at publicsuffix.org.
$ composer require jeremykendall/php-domain-parser
// Don't use this code, it's just to illustrate where the file could be
$publicSuffixList = file_get_contents('https://publicsuffix.org/list/public_suffix_list.dat');
$path = '/tmp/public_suffix_list.dat';
file_put_contents($path, $publicSuffixList);
// ...
domain('https://repat.de/about?foo=bar', $path);
// returns: repat.de
Returns the string with all URLs for given protocols made into links. Optionally, attributes for the a tag can be passed.
linkify('https://google.com is a search engine');
// returns: <a href="https://google.com">google.com</a> is a search engine
linkify('https://google.com is a search engine', ['https'], ['target' => '_blank']);
// returns: <a target="_blank" href="https://google.com">google.com</a> is a search engine
Returns the embedded version of a given YouTube or Vimeo URL.
embedded_video_url('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
// returns: https://www.youtube.com/embed/dQw4w9WgXcQ
embedded_video_url('https://vimeo.com/50491748');
// returns: https://player.vimeo.com/video/50491748
Unpacks an associated array into an unordered list. Default separator is :
.
ul_li_unpack(['foo' => 'bar']);
// returns: <ul><li>foo: bar</li></ul>
ul_li_unpack(['foo' => 'bar'], '=>');
// returns: <ul><li>foo=> bar</li></ul>
Uses the Luminosity Contrast algorithm to determine if white or black would be the best contrast color for a given hex background color.
Source: tomloprod on stackoverflow
contrast_color('b9b6b6');
// returns: #000000
contrast_color('#496379');
// returns: #ffffff
Returns the emoji flag for a ISO-3166 alpha-2 code, such as nz
for New Zealand or py
for Paraguay. Lowercase / Uppercase doesn't play a role. Will return a waving black flag for non existing country code (or rather, Unicode doesn't have a flag for it) or null
. XK
will give you the flag of Kosovo.
emoji_flag('nz');
// returns: 🇳🇿
emoji_flag('PY');
// returns: 🇵🇾
emoji_flag(null);
// returns: 🏴
PARETO_HIGH
: 80PARETO_LOW
: 20MARIADB_DEFAULT_STRLEN
: 191ONE_HUNDRED_PERCENT
: 100KILO
: 1000KIBI
: 1024NBSP
:\xc2\xa0
CR
:\r
LF
:\n
CRLF
:\r\n
HTTP_1_0_VERBS
: [get, head, post]HTTP_1_1_VERBS
: [get, head, post, connect, delete, options, put, trace]HTTP_VERBS
: [get, head, post, connect, delete, options, put, trace, patch]REGEX_WORD_BOUNDARY
: \bREGEX_FIRST_RESULT_KEY
: 1REGEX_UPPERCASE_ASCII
: (A-Z)REGEX_LOWERCASE_ASCII
: (a-z)REGEX_NUMBERS
: (0-9)REGEX_NEWLINES
: \n|\r\n?MACOS
: macosWINDOWS
: windowsLINUX
: linuxBSD
: bsdEXIT_SUCCESS
: 0EXIT_FAILURE
: 1HEX_RED
: #ff0000HEX_GREEN
: #00ff00HEX_BLUE
: #0000ffHEX_WHITE
: #ffffffHEX_BLACK
: #000000WEAK_CIPHERS
: [ TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, SSL_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA]INET_ADDRSTRLEN
: 16INET6_ADDRSTRLEN
: 46
- MIT, see LICENSE
- Version 0.1.22
- Homepage: https://repat.de
- e-mail: repat@repat.de
- Twitter: @repat123