【问题标题】:PHP array merge on Inner keys内部键上的PHP数组合并
【发布时间】:2018-01-22 11:18:58
【问题描述】:

我有两个数组,例如:

$a = [
    0 => [
        'price' => 5.5
    ],
    1 => [
        'price' => 6.0
    ],
    2 => [
        'price' => 6.2
    ],
    3 => [
        'price' => 6.5
    ],
];

$b = [
    0 => [
        'color' => 'RED'
    ],
    1 => [
        'color' => 'WHITE'
    ],
    2 => [
        'color' => 'BLUE'
    ],
    3 => [
        'color' => 'RED'
    ],
];

我应该有这样的回应:

Array
(
    [0] => Array
        (
            [price] => 5.5
            [color] => RED
        )
    [1] => Array
        (
            [price] => 6
            [color] => WHITE
        )
    [2] => Array
        (
            [price] => 6.2
            [color] => BLUE
        )
    [3] => Array
        (
            [price] => 6.5
            [color] => RED
        )
)

我听说过这个函数:array_merge_recursive,但响应不是必需的:

Array
(
    [0] => Array
        (
            [price] => 5.5
        )
    [1] => Array
        (
            [price] => 6
        )
    [2] => Array
        (
            [price] => 6.2
        )
    [3] => Array
        (
            [price] => 6.5
        )
    [4] => Array
        (
            [color] => RED
        )
    [5] => Array
        (
            [color] => WHITE
        )

    [6] => Array
        (
            [color] => BLUE
        )
    [7] => Array
        (
            [color] => RED
        )
    )

所以我决定编写自己的函数:

function merge ($a, $b) {
    $keys = array_keys($a);
    foreach ($keys as $value) {
        if (isset($b[$value])) {
            $tmp = array_keys($b[$value]);
            foreach ($tmp as $val){
                $a[$value][$val] = $b[$value][$val];
            }
        }
    }
    return $a;
}
print_r(merge($a, $b));

我得到了正确的回应:

Array
(
    [0] => Array
        (
            [price] => 5.5
            [color] => RED
        )
    [1] => Array
        (
            [price] => 6
            [color] => WHITE
        )
    [2] => Array
        (
            [price] => 6.2
            [color] => BLUE
        )
    [3] => Array
        (
            [price] => 6.5
            [color] => RED
        )
)

问题是它适用于小数组但不适用于大数组,所以我的问题是:如何优化函数?因为复杂性会根据合并的键而增加。

使用 PHP 7.0

【问题讨论】:

    标签: php arrays function merge time-complexity


    【解决方案1】:

    简单的解决方案可能是,

    $c = [];
    
    for($i=0; $i<count(array_keys($a)); $i++) {
      $c[$i] =array_merge($a[$i], $b[$i]);
    }
    
    print_r($c);
    

    https://repl.it/KJNL

    【讨论】:

      【解决方案2】:

      您可以改用array_replace_recursive()

      array_replace_recursive($a, $b);
      

      演示:https://3v4l.org/bFIZ2

      【讨论】:

      • 可能更快,我忘了那个。
      • 是的,这要快得多并且完全符合要求!
      【解决方案3】:

      您需要检查它们的长度是否相同,然后只需一个简单的foreach

      foreach($a as $k => $v) {
          $result[$k] = array_merge($v, $b[$k]);
      }
      

      【讨论】:

      • 可以合并多个key,数组长度可能不一样
      • Magnus 有最好的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多