Php 设置或添加关联数组数值的短方法?
是否有一个较短的方法来完成以下任务Php 设置或添加关联数组数值的短方法?,php,Php,是否有一个较短的方法来完成以下任务 <?php $arr = []; // ... if(isset($arr['key'])) $arr['key'] += 10; else $arr['key'] = 10; ?> 使用三元运算符:试试 <?php $arr = []; // ... $arr['key']= isset($arr['key'])?($arr['key']+10):10; 使用三元运算符
<?php
$arr = [];
// ...
if(isset($arr['key']))
$arr['key'] += 10;
else
$arr['key'] = 10;
?>
使用三元运算符:试试
<?php
$arr = [];
// ...
$arr['key']= isset($arr['key'])?($arr['key']+10):10;
使用三元运算符:试试看
<?php
$arr = [];
// ...
$arr['key']= isset($arr['key'])?($arr['key']+10):10;
似乎是最短的解决方案
有什么要反对的吗?真的不确定,@
是否会导致效率低下
似乎是最短的解决方案
有什么要反对的吗?确实不确定,@
是否会导致效率低下您有几种解决方案:
引用函数
在参数上使用和
这意味着为每个变量调用一个新的函数。不适用于资源,仅适用于编码样式:)
您可以创建定义函数:
<?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;
?>
或:
如果变量不存在,则指定默认值。之后,像往常一样使用变量
三元运算符
$varA
是所需变量的值,如果不存在,则为默认值。您有几种解决方案:
引用函数
在参数上使用和
这意味着为每个变量调用一个新的函数。不适用于资源,仅适用于编码样式:)
您可以创建定义函数:
<?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;
?>
或:
如果变量不存在,则指定默认值。之后,像往常一样使用变量
三元运算符
$varA
是所需变量的值,如果该变量不存在,则为默认值。如果使用的是PHP7,则可以利用新的??
。(“…如果第一个操作数存在且不为空,则返回其第一个操作数;否则返回其第二个操作数。”)
上面发生的情况:如果未定义,括号中的表达式将$arr['key']
设置为0,否则保持原样;并将+10添加到结果中。这是最短的方法
最常见且易于理解的解决方案是使用?:代码>三值运算符:
$arr['key'] = isset($arr['key']) ? $arr['key'] + 10 : 10; // or:
$arr['key'] = !isset($arr['key']) ? 10 : $arr['key'] + 10;
你也可以这样做:
isset($arr['key']) && ($arr['key'] += 10) || ($arr['key'] = 10); // or:
!isset($arr['key']) && ($arr['key'] = 10) || ($arr['key'] += 10);
一句话:PHP中没有“define if not exists”的内置解决方案,如果您试图增加一个不存在的变量,就会出现警告
至于这里的一些其他答案:我不会用@来抑制错误,这不是好的做法。保持简短,不要刻薄。对每个变量增量进行单独的函数调用似乎太过分了
对于那些即将进行微优化的人,以及那些需要了解的好奇者;每个项目10万次迭代的基准测试。定义一次,然后在循环中递增时;例1:2.43秒;Ex.2a:2.93秒;Ex.2b:3.03秒,Ex.3a:3.12秒,Ex.3b:3.02秒。。。每次迭代中未设置和定义时;Ex.1:3.49秒,Ex.2a:3.22秒,Ex.2b:3.86秒,Ex.3a:3.78秒,Ex.3b:4.50秒。(对于上下文,简单地定义变量10M次需要1.85秒,取消设置+重新定义需要2.67秒。)
由于直接在C中检查变量而不是引发PHP isset函数调用,Null合并和三元运算符将执行得更好。抑制@$arr['key']+=10的错误在第一次测试中,代码>接近时钟2.39秒;但是,每次触发错误抑制时,秒钟都会受到沉重的惩罚;8.34秒;如果我让框架的错误处理程序保持打开状态,那就需要53.7秒 如果您使用的是PHP7,则可以利用新的??
。(“…如果第一个操作数存在且不为空,则返回其第一个操作数;否则返回其第二个操作数。”)
上面发生的情况:如果未定义,括号中的表达式将$arr['key']
设置为0,否则保持原样;并将+10添加到结果中。这是最短的方法
最常见且易于理解的解决方案是使用?:代码>三值运算符:
$arr['key'] = isset($arr['key']) ? $arr['key'] + 10 : 10; // or:
$arr['key'] = !isset($arr['key']) ? 10 : $arr['key'] + 10;
你也可以这样做:
isset($arr['key']) && ($arr['key'] += 10) || ($arr['key'] = 10); // or:
!isset($arr['key']) && ($arr['key'] = 10) || ($arr['key'] += 10);
一句话:PHP中没有“define if not exists”的内置解决方案,如果您试图增加一个不存在的变量,就会出现警告
至于这里的一些其他答案:我不会用@来抑制错误,这不是好的做法。保持简短,不要刻薄。对每个变量增量进行单独的函数调用似乎太过分了
对于那些即将进行微优化的人,以及那些需要了解的好奇者;每个项目10万次迭代的基准测试。定义一次,然后在循环中递增时;例1:2.43秒;Ex.2a:2.93秒;Ex.2b:3.03秒,Ex.3a:3.12秒,Ex.3b:3.02秒。。。每次迭代中未设置和定义时;Ex.1:3.49秒,Ex.2a:3.22秒,Ex.2b:3.86秒,Ex.3a:3.78秒,Ex.3b:4.50秒。(对于上下文,简单地定义变量10M次需要1.85秒,取消设置+重新定义需要2.67秒。)
由于直接在C中检查变量而不是引发PHP isset函数调用,Null合并和三元运算符将执行得更好。抑制@$arr['key']+=10的错误在第一次测试中,代码>接近时钟2.39秒;但是,每次触发错误抑制时,秒钟都会受到沉重的惩罚;8.34秒;如果我让框架的错误处理程序保持打开状态,那就需要53.7秒 $arr['key']=($arr['key']0)+10
?你试过什么?@CodeCaster这给我一个语法错误是@$arr['key']+=10代码>任何方式的坏样式?似乎是我的最短解决方案$arr['key']=($arr['key']??0)+10
?你试过什么?@CodeCaster这给我一个语法错误是@$arr['key']+=10代码>任何方式的坏样式?似乎是最短的解决方案meClearly工程,但我仍然在寻找一个较短的版本,如果有任何
isset($arr['key']) && ($arr['key'] += 10) || ($arr['key'] = 10); // or:
!isset($arr['key']) && ($arr['key'] = 10) || ($arr['key'] += 10);