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

How to merge sub-arrays in multidimensional array if names are similar

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

姓名:

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
    )
)

$names 数组的 array_count_values() 中获取不同的值计数,然后使用它来定义要在 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);

您可以使用 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

<?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',
    ),
  )

如果第一个数组没有像值一样分组,首先对它们进行分类。