【问题标题】:Coalesce for arrays with PHP使用 PHP 合并数组
【发布时间】:2015-11-05 15:46:57
【问题描述】:

Coalesce 并不是真正正确的词,因为它返回第一个非 NULL 值,但希望它传达了意图。

有没有一种更易读、更简洁的方法来从$arr$_GET$_POST 获取foo 的第一个定义值?

function foo($arr=array())
{
   $arr['bar']=isset($arr['bar'])?$arr['bar']:(isset($_GET['bar'])?$_GET['bar']:(isset($_POST['bar'])?$_POST['bar']:NULL));
   //  ....
}

【问题讨论】:

  • 嵌套三元组是一个可怕的想法,无论是从可读性还是可维护性。不,没有捷径可走。您必须使用 isset() 测试每个 var 个体。
  • 首先我会使用$_REQUEST 来省去你的麻烦:)
  • 我通常会考虑可读性而不是简洁性。我不会将这样的三元组组合在一行中。
  • $arr['bar'] = $arr['bar'] ?? $_GET['bar'] ?? $_POST['bar'] ?? NULL; - 仅限 PHP7 - 即将在您附近的服务器上推出:-D
  • @Sebas 不想使用 $_REQUEST,因为它包含 cookie。猜猜我可以重新配置 PHP 来改变...

标签: php arrays


【解决方案1】:

array_merge 是您正在寻找的功能。最后一个参数数组的优先级。

$allData = array_merge($_POST, $_GET, $arr);
return $allData['bar'];

【讨论】:

  • 您确定这是解决方案吗?如果 POST 和 GET 都填了怎么办?我们得到两个条目吗?只是问问题,我只是想知道
  • 喜欢这个主意。一个警告是密钥类型。
  • @ficuscr true,但示例使用字符串键,并且 $_GET 也应该有字符串键
  • @SamBurns 同意。您能否更新您的答案并显示在传递给array_merge 时应该如何对数组进行排序,因为它可能对某些人来说是反直觉的而没有看到它。但实际上,这并不能解释“第一个非空”.. 数组翻转并希望没有值发生冲突?
  • 实际上$arr + $_GET + $_POST 会比array_merge 更好,因为它也适用于数字键。
【解决方案2】:

假设存在已定义的偏移量但值恰好为空,则将 array_merge+ 运算符与数组一起使用存在一些问题。

以下是三种不同的方法以及每种方法的输出。

<?php

$a = ['foo' => null];
$b = ['foo' => 'bar_b'];
$c = ['foo' => 'bar_c'];

var_dump($a + $b + $c);

var_dump(array_merge($c, $b, $a));  //reverse order here!

function getFirstSetOffsetFromArrays($key, $arr) {
  foreach($arr as $v) {
    if (isset($v[$key]) && !empty($v[$key])) {
      return $v[$key];
    }
  }
}

var_dump(getFirstSetOffsetFromArrays('foo', [$a, $b, $c]));

输出:

array(1) { ["foo"]=> NULL }
array(1) { ["foo"]=> NULL }
string(5) "bar_b" 

【讨论】:

    【解决方案3】:

    这里有一些可行的答案,虽然没有一个很好看:Using short circuiting to get first non-null variable

    从上面为您的变量修改的选择答案:

    @$arr['bar'] = $arr['bar'] ?: $_GET['bar'] ?: $_POST['bar'] ?: NULL;
    

    【讨论】:

    • 未定义索引通知呢?
    【解决方案4】:

    这里已经有几个很好的例子,但我更喜欢:

    $arr['bar'] = 
        current(filter_var_array($arr, ['bar' => FILTER_DEFAULT])) ?: 
        filter_input(INPUT_GET, 'bar', FILTER_DEFAULT) ?: 
        filter_input(INPUT_POST, 'bar', FILTER_DEFAULT) ?: 
        null;
    

    优势

    • 每个数组只使用一次密钥(更易于维护)。
    • 更具可读性。
    • 选择第一个有效输入(例如第一个有效号码或电子邮件)。
    • 不会触发未定义索引通知。
    • 无需使用@

    缺点

    • 实际上比原始代码长。
    • 只有在使用$_GET$_POST 时才有意义,否则太复杂了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多