使用PHP合并数组

时间:2015-08-12 20:58:45

标签: php arrays

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

是否有更可读,更简洁的方法从foo$arr,然后$_GET获取$_POST的第一个定义值?

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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" 

答案 2 :(得分:0)

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

为变量修改上面的答案:

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

答案 3 :(得分:-1)

这里有几个很好的例子,但我更愿意:

$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时才有意义,否则会过于复杂。