Last active
February 6, 2016 11:02
-
-
Save gintsmurans/b3c686089b64ef80cd74 to your computer and use it in GitHub Desktop.
Various useful php functions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Returns fixed floating number with precision of $precision. Replaces "," to "." and " " to "". | |
* | |
* @param $input mixed | |
* @param $precision int | |
* @return float | |
*/ | |
function fixFloat($input, $precision = -1) | |
{ | |
$input = str_replace([',', ' '], ['.', ''], $input); | |
return ($precision === -1 ? (double)$input : round((double)$input, $precision)); | |
} | |
/** | |
* Trim characters, can be used with array_walk | |
* | |
* @param $value mixed | |
* @param $pos int | |
* @param $character_mask string Characters to trim | |
* @return mixed | |
*/ | |
function trimChars(&$value, $pos, $character_mask = " \t\n\r\0\x0B") | |
{ | |
/* | |
Unicode variant: | |
$value = preg_replace('/^['.$character_mask.']*(?U)(.*)['.$character_mask.']*$/u', '\\1', $value); | |
*/ | |
$value = trim($value, $character_mask); | |
} | |
/** | |
* Locale specific number_format | |
* | |
* @param $number int|float | |
* @param $decimals int Precision | |
* @return float | |
*/ | |
function localeNumberFormat($number, $decimals = 2) | |
{ | |
$locale = localeconv(); | |
return number_format($number, $decimals, $locale['decimal_point'], $locale['thousands_sep']); | |
} | |
/** | |
* Returns unique uuid4 value | |
* | |
* @return string | |
*/ | |
function uuid4() | |
{ | |
$data = openssl_random_pseudo_bytes(16); | |
$data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 | |
$data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 | |
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); | |
} | |
/** | |
* Returns array containing week's start and week's end | |
* | |
* @param $week int A Week | |
* @param $year int of a Year | |
* @return array | |
*/ | |
function weekRange($week, $year = null) | |
{ | |
if (empty($year)) { | |
$year = date('Y'); | |
} | |
$week -= 1; | |
$ts = strtotime("{$year}0104 +{$week} weeks"); // By http://en.wikipedia.org/wiki/ISO_8601#Week_dates | |
$start = (date('w', $ts) == 1) ? $ts : strtotime('last monday', $ts); | |
return array($start, strtotime('next sunday', $start)); | |
} | |
/** | |
* Returns how many weeks there will be or was in a specific year. | |
* | |
* @param $year int A year | |
*/ | |
function getIsoWeeksInYear($year) | |
{ | |
$date = new DateTime; | |
$date->setISODate($year, 53); | |
return ($date->format("W") === "53" ? 53 : 52); | |
} | |
/** | |
* Returns array containing only values with their keys whose keys are in $keys parameter. | |
* Also can return false if $required is specified and any of $keys are missing. | |
* Also can fill missing keys with $fill_missing, if its other than false | |
* | |
* @param $array array Original array | |
* @param $keys array Array of keys | |
* @param $required bool Whether return false if there are missing keys | |
* @param $fill_missing bool|mixed Fill missing keys with this value | |
* @return array | |
*/ | |
function extractArrayByKeys($array, $keys, $required = false, $fill_missing = false) | |
{ | |
// Check if input is an array | |
if (is_array($array) === false) { | |
return false; | |
} | |
// Build new array | |
$new_array = []; | |
foreach ($keys as $key) { | |
if (isset($array[$key])) { | |
$new_array[$key] = $array[$key]; | |
} else if ($required === true) { | |
return false; | |
} else if ($fill_missing !== false) { | |
$new_array[$key] = $fill_missing; | |
} | |
} | |
// Return new array | |
return $new_array; | |
} | |
/** | |
* Returns a boolean value representing whether any of the passed array elements are empty | |
* | |
* @return boolean | |
*/ | |
function anyEmpty($array) | |
{ | |
return (count($array) !== count(array_filter($array))); | |
} | |
/** | |
* Returns a boolean value representing whether all of the passed array elements are empty | |
* | |
* @return boolean | |
*/ | |
function allEmpty($array) | |
{ | |
return (count(array_filter($array)) === 0); | |
} | |
/** | |
* Returns string pointing to a (somehow) random temporary filename | |
* | |
* @return string | |
*/ | |
function tmpFilename($prefix = 'tmp_', $postfix = '') | |
{ | |
$random = uniqid(rand(), true); | |
$random = str_replace('.', '_', $random); | |
$filename = sys_get_temp_dir().'/'.$prefix.$random.$postfix; | |
return $filename; | |
} | |
/** | |
* Group $array by $keys. | |
* When $keys == ['id', 'name'], Turns [['id' => 1, 'name' => 'Name 1'], ['id' => 2, 'name' => 'Name 2'] into | |
* [1 => ['Name 1' => ['id' => 1, 'name' => 'Name 1']], 2 => ['Name 2' => ['id' => 2, 'name' => 'Name 2']]] | |
* | |
* @param iterator $array | |
* @param mixed $keys | |
* @param bool $unique Describes whether last key of input array is unique | |
* @return array[] Returns array grouped by keys | |
*/ | |
function groupArray($array, $keys = [], $unique = false) | |
{ | |
$keys = (array)$keys; | |
$result = []; | |
foreach ($array as $item) { | |
$x = &$result; | |
foreach ($keys as $key) { | |
$x = &$x[$item[$key]]; | |
} | |
if ($unique === true) { | |
$x = $item; | |
} else { | |
$x[] = $item; | |
} | |
} | |
return $result; | |
} | |
/** | |
* Returns wheather date has a valid ISO8601 format. | |
* | |
* @param string Date string | |
* @return bool Returns true or false | |
*/ | |
function validISODate($date) | |
{ | |
return preg_match('/([0-9]{4})-([0-9]{2})-([0-9]{2})/', $date); | |
} | |
/** | |
* Returns wheather datetime has a valid ISO8601 format. | |
* | |
* @param string Datetime string | |
* @return bool Returns true or false | |
*/ | |
function validISODateTime($datetime) | |
{ | |
return preg_match( | |
'/^'. | |
'(\d{4})-(\d{2})-(\d{2})T'. // YYYY-MM-DDT ex: 2014-01-01T | |
'(\d{2}):(\d{2}):(\d{2})'. // HH-MM-SS ex: 17:00:00 | |
'(Z|((-|\+)\d{2}:\d{2}))'. // Z or +01:00 or -01:00 | |
'$/' | |
, $datetime | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment