rikudou/array-merge-recursive

替换内置的 array_merge_recursive 函数,该函数不会向数组中添加值而是替换它们

v1.0.3 2021-04-22 14:29 UTC

This package is auto-updated.

Last update: 2024-08-29 05:07:04 UTC


README

Tests Code Quality Coverage Status Download

安装

composer require rikudou/array-merge-recursive

描述

PHP函数 array_merge_recursive 的行为有些令人困惑,并且与 array_merge 完全不同。

令人困惑的行为示例

<?php

$array1 = [
    'test' => 'test'
];

$array2 = [
    'test' => 'test2'
];

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

// $result = 
// array(1) {
//   'test' =>
//   array(2) {
//     [0] =>
//     string(4) "test"
//     [1] =>
//     string(5) "test2"
//   }
// }

如你所见,内置函数不会替换相同的键,而是将它们合并在一起。

与常规 array_merge 相比

<?php

$array1 = [
    'test' => 'test'
];

$array2 = [
    'test' => 'test2'
];

$result = array_merge($array1, $array2);

// $result = 
// array(1) {
//   'test' =>
//   string(5) "test2"
// }

array_merge 替换值以最新的值,但不适用于深层数组结构。

此库替换了 array_merge_recursive 的行为,使其像常规 array_merge 一样工作,同时保留递归合并深层数组的能力。

示例

<?php

use function Rikudou\ArrayMergeRecursive\array_merge_recursive;

$array1 = [
    'test' => 'test'
];

$array2 = [
    'test' => 'test2'
];

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

// $result = 
// array(1) {
//   'test' =>
//   string(5) "test2"
// }

深层级别数组示例

以下示例中使用这两个数组

<?php

$array1 = [
    'test' => [
        'key1' => 'test',
        'key2' => 'test',
        'key3' => 'test'
    ]
];

$array2 = [
    'test' => [
        'key2' => 'test2',
        'key4' => 'test2'
    ]
];

内置 array_merge_recursive 的结果

array(1) {
  'test' =>
  array(4) {
    'key1' =>
    string(4) "test"
    'key2' =>
    array(2) {
      [0] =>
      string(4) "test"
      [1] =>
      string(5) "test2"
    }
    'key3' =>
    string(4) "test"
    'key4' =>
    string(5) "test2"
  }
}

在这里你可以看到 key2 被更改为包含两个值数组的数组。

内置 array_merge 的结果

array(1) {
  'test' =>
  array(2) {
    'key2' =>
    string(5) "test2"
    'key4' =>
    string(5) "test2"
  }
}

由于 array_merge 不会递归工作,它完全用第二个数组的值替换了 test 键。

此库的 array_merge_recursive 的结果

array(1) {
  'test' =>
  array(4) {
    'key1' =>
    string(4) "test"
    'key2' =>
    string(5) "test2"
    'key3' =>
    string(4) "test"
    'key4' =>
    string(5) "test2"
  }
}

此库正确地用后续值替换了 key2,同时保持了整个树。