如果名称相似,如何在多维数组中合并子数组

时间:2019-07-14 15:55:05

标签: php arrays multidimensional-array array-merge

我正在尝试合并两个数组。一个数组具有名称,另一个数组具有值。我想将它们合并到单个多维数组中,如果值的名称相似,则它们在同一子数组中。我是编程新手,什么也没做

名称:

Array
(
    [0] => TestAgent
    [1] => TestAgent1
    [2] => TestAgent1
    [3] => TestAgent2
    [4] => TestAgent2
    [5] => TestAgent2
)

值:

Array
(
    [0] => 2019-04
    [1] => 2019-05
    [2] => 2019-06
    [3] => 2019-04
    [4] => 2019-05
    [5] => 2019-06
)

这是期望的输出

Array
(
    [0] => Array
    (
        [0] => TestAgent
        [1] => 2019-04
    )
    [1] => Array
    (
        [0] => TestAgent1
        [1] => 2019-05
        [2] => 2019-06
    )
    [2] => Array
    (
        [0] => TestAgent2
        [1] => 2019-04
        [2] => 2019-05
        [3] => 2019-06
    )
)

3 个答案:

答案 0 :(得分:2)

array_count_values()数组上的$names获取不同的值计数,然后使用该值来定义array_slice()中要使用的元素数。切片的元素数量增加了下一个偏移量。

$counts = array_count_values($names);
$offset = 0;

foreach (array_values(array_unique($names)) as $key=>$name) {
    $slice = array_slice($values, $offset, $counts[$name]);
    $offset += count($slice);
    $result[$name] = $slice;
}

print_r($result);

答案 1 :(得分:2)

您可以使用array_intersect_key从名称数组中获取匹配的值。

此方法不需要排序的数组。

$names = ['TestAgent1', 'TestAgent', 'TestAgent1', 'TestAgent1', 'TestAgent2', 'TestAgent2', 'TestAgent2'];
$values = ['2019-01', '2019-04', '2019-05', '2019-06', '2019-04', '2019-05', '2019-06'];

$unique = array_unique($names);

foreach($unique as $name){
    $res[] = array_merge([$name], array_intersect_key($values, array_intersect($names, [$name])));
}
print_r($res);

输出:

Array
(
    [0] => Array
        (
            [0] => TestAgent1
            [1] => 2019-01
            [2] => 2019-05
            [3] => 2019-06
        )

    [1] => Array
        (
            [0] => TestAgent
            [1] => 2019-04
        )

    [2] => Array
        (
            [0] => TestAgent2
            [1] => 2019-04
            [2] => 2019-05
            [3] => 2019-06
        )

)

https://3v4l.org/MWjv0

答案 2 :(得分:1)

<?php

$one =
[
    'Testagent',
    'Testagent1',
    'Testagent1',
    'Testagent2',
    'Testagent2',
    'Testagent2'
];

$two =
[
    '2019-04',
    '2019-05',
    '2019-06',
    '2019-04',
    '2019-05',
    '2019-06'
];

$n = -1;
$previous = null;
foreach($one as $k=>$v) {
    if($v !== $previous)
        $items[++$n][] = $v;
    $items[$n][] = $two[$k];
    $previous = $v;
}

var_export($items);

输出:

array (
    0 => 
    array (
      0 => 'Testagent',
      1 => '2019-04',
    ),
    1 => 
    array (
      0 => 'Testagent1',
      1 => '2019-05',
      2 => '2019-06',
    ),
    2 => 
    array (
      0 => 'Testagent2',
      1 => '2019-04',
      2 => '2019-05',
      3 => '2019-06',
    ),
  )

如果第一个数组没有分组的相似值,请先对其进行排序。