空值上的PHP合并数组

Posted

技术标签:

【中文标题】空值上的PHP合并数组【英文标题】:PHP merge array on nulls 【发布时间】:2013-05-29 06:55:33 【问题描述】:

我有 2 * array 我想 merge 他们,但每个主题都有一些 NULL rows

$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1    
);

所以,代码:

$c = array_merge($a,$b);

会给$c:

array 
  'a'=> 1
  'b'=> NULL
  'c'=>1

是否有内置或简单的方法来做保证金($a,$b) 如下,但现在$a$b 中的每个相同索引覆盖。如果$b 索引是null,我希望$b 被$a 索引覆盖 - 例如$b['b'] 应该从$a 覆盖

如果可能,应填充所有 NULL 行。

【问题讨论】:

【参考方案1】:

那么你必须将 $b 作为第一个参数传递

$c = array_merge($b,$a);

你可以使用这个功能

function mergeArray($array1, $array2)

    $result = array();

    foreach ($array1 as $key=>$value)
    
        $result[$key] = $value;
    

    foreach ($array2 as $key=>$value)
    
        if (!isset($result[$key] || $result[$key] == null)
        
            $result[$key] = $value;
        
    

    return $result;

【讨论】:

在这种情况下,$b 的非空行将被 $a 的空行覆盖。如果可能,应填充所有 NULL 行。 函数 mergeArray($array1, $array2) $result = array(); foreach ($array1 as $key=>$value) $result[$key] = $value; foreach ($array2 as $key=>$value) if ($result[$key] == null) 【参考方案2】:

我认为您可以使用array_filter 函数删除两个数组中的空值,然后将它们合并

$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1    
);

$b  = array_filter($b);
$a  = array_filter($a);
$c = array_merge($a, $b);
var_dump($c);

这将输出

array(3) 
  ["b"]=> int(1)
  ["c"]=> int(1)
  ["a"]=> int(1)

LIVE SAMPLE

作为旁注,我要补充一点,在没有第二个参数的情况下使用 array_filter 最终会删除所有 NULL 值以及 EMPTY 数组等。如果您只想删除 NULL 值,那么您将需要使用array_filter($yourarray, 'strlen');

已编辑

如果你想保留NULL,如果两个数组都有相同的键并且假设两个数组有相同数量的键/值,那么你需要在你的数组中循环并构建一个新的数组来保留@987654334 @你需要的地方

$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1,
    'd' => NULL
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1,   
    'd' => NULL,
);

$c = array();
foreach($a as $key => $val)

    if($key == NULL && $b[$key] == NULL)
    
        $c[$key] = $val;
     else if($key != NULL && $b[$key] == NULL) 
        $c[$key]= $val;
     else if($key != NULL && $b[$key] != NULL) 
        $c[$key]= $b[$key];
     else 
        $c[$key]= $b[$key];
    

var_dump($c);

这将输出

array (size=4)
  'a' => int 1
  'b' => int 1
  'c' => int 1
  'd' => NULL

LIVE SAMPLE

【讨论】:

如果只有 1 个数组有 'd' 索引 null 怎么办。如果可能的话,我的意思是覆盖“空值”,如果不是,它们应该留下。在这种情况下,所有空值都将被删除。 @Kluska000 我已经根据您的要求更新了答案,请检查 根据您的解决方案,我已经尝试过这个 - 似乎正在工作并且更简单phpfiddle.org/lite/code/rqz-sd4 @Kluska000 如果它能满足您的需求,那就太好了,我很高兴能帮到您。如果您认为答案是正确的,请不要忘记接受它以帮助将来遇到类似问题的人。【参考方案3】:

如果您需要在 both 数组中保留值为 NULL 的键,您可以使用自定义函数,当(且仅当)存在对应的数组时忽略第二个数组中的这些条目第一个数组中的非 NULL 条目。它看起来像这样:

function arrayMergeIgnoringNull($arr1, $arr2) 
    $new2 = array();
    forEach ($arr2 as $key => $value) 
        if (($value !== NULL) || !isSet($arr1[$key])) 
           $new2[$key] = $value;
         
    
    return array_merge($arr1, $new2);

$c = arrayMergeIgnoringNull($a, $b);

另请参阅此short demo

【讨论】:

【参考方案4】:

我会用这样一个简单的衬里来做到这一点:

$c = array_filter($b) + array_filter($a) + array_fill_keys(array_keys($b),null);

这将保留 $b 的所有键和值,除非是错误的,在这种情况下它们将被替换为来自 $a 的值,或者作为最后的手段替换为 null

当使用+ 运算符合并数组时,它们从左到右出现的顺序等同于优先级。所以最左边的位置将保持它的值,除非键不存在。

您也可以颠倒顺序并使用array_merge(),但对我来说这更难:

$c = array_merge(array_fill_keys(array_keys($b),null) + array_filter($a) + array_filter($b));

【讨论】:

【参考方案5】:

这些答案都没有解决合并可能具有不同键的两个数组,这就是我这篇 SO 帖子的原因。幸运的是,它实际上非常简单:

function arrayMergeIfNotNull($arr1, $arr2) 
    foreach($arr2 as $key => $val) 
        $is_set_and_not_null = isset($arr1[$key]);
        if ( $val == NULL && $is_set_and_not_null ) 
            $arr2[$key] = $arr1[$key];
        
    
    return array_merge($arr1, $arr2);

现在,合并这两个数组:

$a = array('a' => NULL, 'b' => 1, 'c' => 1, 'd' => NULL, 'z' => 'zebra');
$b = array('a' => 1, 'b' => NULL, 'c' => 1, 'd' => NULL, 'f' => 'frank');

与:

var_dump(arrayMergeIfNotNull($a, $b));

将产生:

array (size=6)
  'a' => int 1
  'b' => int 1
  'c' => int 1
  'd' => NULL
  'z' => 'zebra'
  'f' => 'frank'

注意这个答案解决了两个数组具有相同键的问题。

【讨论】:

以上是关于空值上的PHP合并数组的主要内容,如果未能解决你的问题,请参考以下文章

【php】合并多个数组并去掉相同的

php数组根据键名怎么合并呢

php 大数组合并去重 两个数组元素都过万

PHP 合并数组 追加数组例子

如何将同一属性上的数组和对象“合并/合并”到平面数组中(使用Javascript)?

php 合并数组合并