【问题标题】:array_merge() without losing null valuesarray_merge() 不丢失空值
【发布时间】:2014-09-12 03:38:25
【问题描述】:

我在 PHP 中有 2 个数组,一个模拟可以编辑的属性,另一个模拟属性和它应该具有的值。

一个例子如下:

$arr1 = array(
    'entity1' => array(
        'property1' => null,
        'property2' => null,
    ),
    'entity2' => array(
        'property3' => null,
        'property4' => null,
        'property5' => null,
    )
);
$arr2 = array(
    'entity1' => array(
        'property1' => 1,
        'property2' => 0,
    ),
    'entity2' => array(
        'property3' => 0,
        'property4' => 1,
    )
);

现在我需要合并这些数组并保留空值,以便输出如下:

$output = array(
    'entity1' => array(
        'property1' => 1,
        'property2' => 0,
    ),
    'entity2' => array(
        'property3' => 0,
        'property4' => 1,
        'property5' => null,
    )
);

我试过array_merge()$arr1 + $arr2 都输出这个:

Array
(
    [entity1] => Array
        (
            [property1] => 1
            [property2] => 0
        )

    [entity2] => Array
        (
            [property3] => 0
            [property4] => 1
        )
)

数组可以比示例中显示的更深,因此它必须是递归的,并且数组都是关联的。

我已经阅读了很多关于 StackOverflow 的问题并在 Google 上搜索了很多,但我找到的答案不是递归的,或者只是不适用于这个问题。

编辑

正如上面解释为什么我问这个问题,即使我检查了其他问题的答案显然没有足够的证据或什么,我尝试了标记的重复问题答案,如下:

$merged = array_merge(array_filter($arr1, 'strval'), array_filter($arr2, 'strval'));

它给了一个数组到字符串的转换错误,因为它不是递归的,这就是我解释的。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    这个递归函数可以作为一个起点:

    function merge_associative($arr1, $arr2) {
      $merged = $arr1;
      foreach ($arr2 as $k => $v) {
        if (is_array($v) && is_array($arr1[$k]))
          $merged[$k] = merge_associative($arr1[$k], $v);
        else
          $merged[$k] = $v;
      }
      return $merged;
    }
    

    它将合并关联数组,但不能正确处理数字索引。

    【讨论】:

    • 感谢您的回答,我在工作中编造了一些我现在不记得的东西(稍后会发布),但它涉及另一个 foreach 循环中的 foreach 循环,这比你已经并且正在消耗更多的性能(虽然你可能不会注意到),谢谢!
    【解决方案2】:

    如果你想加入多个数组,只需使用这个函数

    function array_join() {
        $args = func_get_args();        
        if (count($args) == 1 && isset($args[0], $args[1])) {
            foreach ($args[0] as $value) {
                $param[] = $value;          
            }
        }else{
            $param = $args;         
        }
        
        $array = merge_associative($param[0], $param[1]);
        
        unset($param[0]);
        unset($param[1]);
        
        if (isset($param[2])) $array = array_join($array, $param[2]); 
        
        return $array; 
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多