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);