数组与多维数组合并

时间:2017-10-25 10:07:06

标签: php arrays

我有这个简单的设置:

$array1 = array(0 => array(0 => array('amount' => '49')));
$array2 = array(0 => array(0 => array('amount' => '149')));

$mergetest = array_merge_recursive($array1, $array2);

输出:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    array(1) {
      ["amount"]=>
      string(2) "49"
    }
  }
  [1]=>
  array(1) {
    [0]=>
    array(1) {
      ["amount"]=>
      string(3) "149"
    }
  }
}

它应该以这种方式合并,输出应该是这样的:

    array(1) {
      [0]=>
      array(2) {
        [0]=>
        array(1) {
          ["amount"]=>
          string(2) "49"
        }
        [1]=>
        array(1) {
          ["amount"]=>
          string(3) "149"
        }
      }
    }

由于数组索引0已经存在,其中的数组也是如此 - 所以它应该通过子数组而不是父数组匹配,并以这种方式将下一个子数组添加到它。

这可以以干净的方式完成而无需构建循环并检查的自定义函数吗?

更新

解决方案,也适用于:

$array1 = array(0 => array(0 => array('amount' => '49')));
$array2 = array(1243 => array(0 => array('amount' => '49'), 1 => array('amount' => '449')));

预期输出位于单独的父数组(0和1243)中,就像上面的第一个输出一样。

2 个答案:

答案 0 :(得分:1)

<?php
     $array1 = array(0 => array(0 => array('amount' => '49')));
     $array2 = array(0 => array(0 => array('amount' => '149')));

     $result = array_map('array_merge', $array1, $array2);
     var_dump($result);    
?>

输出如下所示。

array(1) {
  [0]=>
  array(2) {
    [0]=>
    array(1) {
      ["amount"]=>
      string(2) "49"
    }
    [1]=>
    array(1) {
      ["amount"]=>
      string(3) "149"
    }
  }
}

注意:array_merge_recursive()会失败,因为它会附加数字键,而不是合并它们:

更新不同指数的阵列答案

    <?php
        $array1 = array(0 => array(0 => array('amount' => '49')));
        $array2 = array(1243 => array(0 => array('amount' => '49'), 1 => array('amount' => '449')));
        $keys = array_unique(array_merge(array_keys($array1), array_keys($array2)));

        foreach ($keys as $key) {
          if (array_key_exists($key, $array1) && array_key_exists($key, $array2)) {
            $array3[$key] = array_merge($array1[$key], $array2[$key]);
          } elseif (array_key_exists($key, $array1)) {
            $array3[$key] = $array1[$key];
          } else {
            $array3[$key] = $array2[$key];
          }
        }


        var_dump($array3);
?>

输出将是

array(2) {
  [0]=>
  array(1) {
    [0]=>
    array(1) {
      ["amount"]=>
      string(2) "49"
    }
  }
  [1243]=>
  array(2) {
    [0]=>
    array(1) {
      ["amount"]=>
      string(2) "49"
    }
    [1]=>
    array(1) {
      ["amount"]=>
      string(3) "449"
    }
  }
}

答案 1 :(得分:0)

如果在顶级使用字符串键而不是整数,则可以获得所需的结果。

您有两个级别的整数索引数组,但似乎它们具有不同的性质,因为您需要以不同方式合并它们。 PHP无法知道这一点,因此使用此设置,没有标准功能可以满足您的需求。您需要更改数据结构以标记差异(例如,通过在第一级使用字符串键和在第二级使用整数)或在此处编写自定义合并功能。