【问题标题】:PHP merge array on nulls空值上的PHP合并数组
【发布时间】: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 行。

【问题讨论】:

    标签: php arrays merge


    【解决方案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'
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-19
          • 2015-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-27
          相关资源
          最近更新 更多