Is there a shorter way to accomplish the following?
<?php
$arr = [];
// ...
if(isset($arr['key']))
$arr['key'] += 10;
else
$arr['key'] = 10;
?>
Use the ternary operator:Try it
<?php
$arr = [];
// ...
$arr['key']= isset($arr['key'])?($arr['key']+10):10;
@$arr['key'] += 10;
seems to be the shortest solution.
Anything to say against it? Really not sure, whether @
leads to inefficiencies
You have several solutions:
Use
&
on the parametersThis imply a new call of the function for each variable. Not good for resources, only for coding style :)
<?php
function addOrDefine(&$variable, $value, $defaultValue = null) {
if( !isset($variable) )
$variable = $defaultValue;
$variable += $value;
return $variable;
}
$varA = addOrDefine($array['toto'], 10);
$varA = addOrDefine($array['toto'], 10);
var_dump($varA); // output '20'
?>
You can create a define function:
<?php
function variableDefine(&$variable, $defaultValue = null) {
if( !isset($variable) )
$variable = $defaultValue;
return $variable;
}
$varA = variableDefine($varA);
$varB = variableDefine($_GET['varB'], 'defaultvalue');
?>
<?php
if( !isset($array['toto']) ) {
$array['toto'] = null;
}
$array['toto'] += 10;
?>
Can be simplified on:
<?php
if( !isset($array['toto']) )
$array['toto'] = null;
$array['toto'] += 10;
?>
Or:
<?php
if( !isset($array['toto']) ) $array['toto'] = null;
$array['toto'] += 10;
?>
Assign value if the variable does not exists with default value. After, use the variable as usual.
<?php
$varA = isset($array['toto']) ? $array['toto'] : 10;
// or
// if you want to use the previous point
$array['toto'] = isset($array['toto']) ? $array['toto'] : null;
$array['toto'] += 10;
?>
$varA
is the value of the variable needed, with default value if it's not existing.
If you're using PHP7, you can take advantage of the new ??
null coalescing operator. ("...returns its first operand if it exists and is not NULL; otherwise it returns its second operand.")
$arr['key'] = ($arr['key'] ?? 0) + 10;
What happens above: The expression in the brackets sets $arr['key']
to 0 if it isn't defined, otherwise leaves it as-is; and +10 is added to the result. This is the shortest approach.
The most common and easy-to-understand solution is using the ? :
ternary operator:
$arr['key'] = isset($arr['key']) ? $arr['key'] + 10 : 10; // or:
$arr['key'] = !isset($arr['key']) ? 10 : $arr['key'] + 10;
You could also do something like this:
isset($arr['key']) && ($arr['key'] += 10) || ($arr['key'] = 10); // or:
!isset($arr['key']) && ($arr['key'] = 10) || ($arr['key'] += 10);
Bottom line: There's no built-in solution in PHP for "define-if-not-exists", there will be a warning if you attempt to increment a non-existing variable.
As far as some other answers here: I wouldn't use @ to suppress errors, not good practice. Keep it short, not hackish. Incurring a separate function call on each variable increment seems excessive.
For those about to micro-optimize, and for the inquiring minds who need to know; benchmarks for 10M iterations of each. When defined once and then incremented in a loop; Ex.1: 2.43 sec; Ex.2a: 2.93 sec; Ex.2b: 3.03 sec, Ex.3a: 3.12 sec, Ex.3b: 3.02 sec. ... When unset & defined in each iteration; Ex.1: 3.49 sec, Ex.2a: 3.22 sec, Ex.2b: 3.86 sec, Ex.3a: 3.78 sec, Ex.3b: 4.50sec. (For context, simply defining the variable 10M times takes 1.85 sec, and unset+redefine takes 2.67 sec.)
Null-coalescing and ternary operators will perform better due to checking the variable directly in C instead of incurring a PHP isset function call. The error-suppressing @$arr['key'] += 10;
approach clocks 2.39 sec in the first test; but clocks a heavy penalty in the second when the error suppression is triggered each time; 8.34 sec; and a whopping 53.7 sec if I leave my framework's error handler on!