coalesce.php
· 1000 B · PHP
Sin formato
<?php
/**
* Simple php equivalent of Oracle's coalesce()
*
* It can be used as simple oneline-alternative to switch or if operators in many
* cases without difficult logic. For example, get first non-empty value from bunch of vars:
*
* echo coalesce($var1, $var2, $var3, ...);
*
* is alternative to:
*
* if ($var1) {
* return $var1;
* } elseif ($var2) {
* return $var2;
* } elseif ....
*
* or
*
* return $var1 ?? $var2 ?? $var3 ...
*
* @see https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm
* @author Anthony Axenov
* @return mixed|null
*/
function coalesce() {
foreach (func_get_args() as $arg) {
if (is_callable($arg)) {
$arg = call_user_func($arg);
}
if ($arg !== null) {
return $arg;
}
}
return null;
}
//usage:
$var1 = null;
$var2 = function() use ($var1) {
return $var1;
};
$var3 = 3;
$var4 = '4';
$result = coalesce($var1, $var2, $var3, $var4);
var_dump($result);
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Simple php equivalent of Oracle's coalesce() |
| 5 | * |
| 6 | * It can be used as simple oneline-alternative to switch or if operators in many |
| 7 | * cases without difficult logic. For example, get first non-empty value from bunch of vars: |
| 8 | * |
| 9 | * echo coalesce($var1, $var2, $var3, ...); |
| 10 | * |
| 11 | * is alternative to: |
| 12 | * |
| 13 | * if ($var1) { |
| 14 | * return $var1; |
| 15 | * } elseif ($var2) { |
| 16 | * return $var2; |
| 17 | * } elseif .... |
| 18 | * |
| 19 | * or |
| 20 | * |
| 21 | * return $var1 ?? $var2 ?? $var3 ... |
| 22 | * |
| 23 | * @see https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm |
| 24 | * @author Anthony Axenov |
| 25 | * @return mixed|null |
| 26 | */ |
| 27 | function coalesce() { |
| 28 | foreach (func_get_args() as $arg) { |
| 29 | if (is_callable($arg)) { |
| 30 | $arg = call_user_func($arg); |
| 31 | } |
| 32 | if ($arg !== null) { |
| 33 | return $arg; |
| 34 | } |
| 35 | } |
| 36 | return null; |
| 37 | } |
| 38 | |
| 39 | //usage: |
| 40 | |
| 41 | $var1 = null; |
| 42 | $var2 = function() use ($var1) { |
| 43 | return $var1; |
| 44 | }; |
| 45 | $var3 = 3; |
| 46 | $var4 = '4'; |
| 47 | |
| 48 | $result = coalesce($var1, $var2, $var3, $var4); |
| 49 | var_dump($result); |
| 50 |
decode.php
· 2.4 KiB · PHP
Sin formato
<?php
/**
* Simple php equivalent of Oracle's decode()
*
* It can be used as simple oneline-alternative to switch or if operators in many
* cases without difficult logic. For example, get string mnemocode of some value:
*
* echo 'State: '.decode($state, 0, 'disabled', 1, 'enabled', 'unknown');
*
* will output:
* 'State: disabled' if $state === 0
* 'State: enabled' if $state === 1
* 'State: unknown' in other cases
*
* This is how decode() works:
* 1) Store first argument separately from other ones to compare them with it
* 2) Reduce and reindex array of arguments from 0
* 3) Detect default value:
* 3.1) If count of fresh args array is odd (which means that decode() was called
* with even args count) then the last known argument is default result.
* We also need to reduce and reindex args array here.
* 3.2) If count is even, then default result === null.
* 4) The rest of args processing this way:
* - every even argument (n, n+2, n+4,...) is possible value;
* - every odd arg (n+1, n+3, n+5,...) is result for previous arg.
*
* @see https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm
* @author Anthony Axenov
* @return mixed
*/
function decode()
{
$args = func_get_args();
$expression = $args[0];
unset($args[0]);
$args = array_values($args);
if (count($args) % 2 !== 0) {
$default = $args[count($args) - 1];
unset($args[count($args) - 1]);
$args = array_values($args);
} else {
$default = null;
}
for ($i = 0; $i < count($args); $i += 2) {
if ($expression === $args[$i] && isset($args[$i + 1])) {
return is_callable($args[$i + 1]) ? call_user_func($args[$i + 1]) : $args[$i + 1];
}
}
return $default;
}
// usage:
$somevar = 'function';
$anything = 'Lorem ipsum dolor sit amet';
$result = decode($somevar, // 0
true , 'decode(): boolean true', // 1
0 , 'decode(): int zero', // 2
'0' , 'decode(): string zero', // 3
'string' , 'decode(): just string', // 4
'function', function() use ($anything) { // 5
// bla-bla-bla some logic here
$anything = explode(' ', $anything);
return 'Hey, this is '.print_r($anything, true);
},
'decode(): default result' // 6 -- comment this line to get null
);
var_dump($result);
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * Simple php equivalent of Oracle's decode() |
| 5 | * |
| 6 | * It can be used as simple oneline-alternative to switch or if operators in many |
| 7 | * cases without difficult logic. For example, get string mnemocode of some value: |
| 8 | * |
| 9 | * echo 'State: '.decode($state, 0, 'disabled', 1, 'enabled', 'unknown'); |
| 10 | * |
| 11 | * will output: |
| 12 | * 'State: disabled' if $state === 0 |
| 13 | * 'State: enabled' if $state === 1 |
| 14 | * 'State: unknown' in other cases |
| 15 | * |
| 16 | * This is how decode() works: |
| 17 | * 1) Store first argument separately from other ones to compare them with it |
| 18 | * 2) Reduce and reindex array of arguments from 0 |
| 19 | * 3) Detect default value: |
| 20 | * 3.1) If count of fresh args array is odd (which means that decode() was called |
| 21 | * with even args count) then the last known argument is default result. |
| 22 | * We also need to reduce and reindex args array here. |
| 23 | * 3.2) If count is even, then default result === null. |
| 24 | * 4) The rest of args processing this way: |
| 25 | * - every even argument (n, n+2, n+4,...) is possible value; |
| 26 | * - every odd arg (n+1, n+3, n+5,...) is result for previous arg. |
| 27 | * |
| 28 | * @see https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm |
| 29 | * @author Anthony Axenov |
| 30 | * @return mixed |
| 31 | */ |
| 32 | function decode() |
| 33 | { |
| 34 | $args = func_get_args(); |
| 35 | $expression = $args[0]; |
| 36 | unset($args[0]); |
| 37 | $args = array_values($args); |
| 38 | if (count($args) % 2 !== 0) { |
| 39 | $default = $args[count($args) - 1]; |
| 40 | unset($args[count($args) - 1]); |
| 41 | $args = array_values($args); |
| 42 | } else { |
| 43 | $default = null; |
| 44 | } |
| 45 | for ($i = 0; $i < count($args); $i += 2) { |
| 46 | if ($expression === $args[$i] && isset($args[$i + 1])) { |
| 47 | return is_callable($args[$i + 1]) ? call_user_func($args[$i + 1]) : $args[$i + 1]; |
| 48 | } |
| 49 | } |
| 50 | return $default; |
| 51 | } |
| 52 | |
| 53 | // usage: |
| 54 | $somevar = 'function'; |
| 55 | $anything = 'Lorem ipsum dolor sit amet'; |
| 56 | $result = decode($somevar, // 0 |
| 57 | true , 'decode(): boolean true', // 1 |
| 58 | 0 , 'decode(): int zero', // 2 |
| 59 | '0' , 'decode(): string zero', // 3 |
| 60 | 'string' , 'decode(): just string', // 4 |
| 61 | 'function', function() use ($anything) { // 5 |
| 62 | // bla-bla-bla some logic here |
| 63 | $anything = explode(' ', $anything); |
| 64 | return 'Hey, this is '.print_r($anything, true); |
| 65 | }, |
| 66 | 'decode(): default result' // 6 -- comment this line to get null |
| 67 | ); |
| 68 | var_dump($result); |
| 69 |