根据顶层(共享值)合并第二层数组

时间:2019-08-05 14:19:37

标签: php multidimensional-array array-merge

我想合并数组的顶层,以便共享同一父级的第二层的所有值都与该父级形成单个数组。

数组1:

Array
(
    [0] => Array
        (
            [0] => C1
            [1] => C1
            [2] => C1
            [3] => AC
            [4] => AC
        )

)

数组2:

Array
(
    [0] => Array
        (
            [0] => C1_complete
            [1] => C1_29-95
            [2] => C1_49-95
            [3] => AC_complete
            [4] => AC_29-95
        )

)

所需结果:

Array
(
    [0] => Array
        (
            'C1' => Array (C1_complete, C1_29-95, C1_49-95),
            'AC' => Array (AC_complete, AC_29-95)
        )

)

实现这一目标的简单,优雅的方法是什么?

我寻求一种可以将相同原理推广到任何两级数组结构的解决方案。

3 个答案:

答案 0 :(得分:0)

如果我仅使用数组2和一个简单的foreach循环,则可以这样做:

$array2 = [['C1_complete', 
            'C1_29-95',
            'C1_49-95',
            'AC_complete',
            'AC_29-95']];

$buffer = [];

foreach ($array2[0] as $value) {
    $buffer[substr($value, 0, 2)][] = $value;
}

$result[] = $buffer;

echo '<pre>';
print_r($result);
echo '</pre>';

输出为:

Array
(
    [0] => Array
        (
            [C1] => Array
                (
                    [0] => C1_complete
                    [1] => C1_29-95
                    [2] => C1_49-95
                )

            [AC] => Array
                (
                    [0] => AC_complete
                    [1] => AC_29-95
                )

        )

)

如果该代码在函数中,那就太好了

function classify($array)
{    
    $result = [];
    foreach ($array[0] as $value) {
        $result[substr($value, 0, 2)][] = $value;
    }
    return [$result];
}    

$array2 = [['C1_complete', 
            'C1_29-95',
            'C1_49-95',
            'AC_complete',
            'AC_29-95']];

echo '<pre>';
print_r(classify($array2));
echo '</pre>';

输出保持不变。

答案 1 :(得分:0)

对于数组,您不需要第一个循环,但是如果您的数组中有多个数组。只需循环并grep以键开头的项目即可:

foreach($array1 as $key => $inner) {
    foreach($inner as $k) {
        $result[$key][$k] = preg_grep("/^$k/", $array2[0]);
    }
}

使用给定的数组:

foreach($array1[0] as $k) {
    $result[0][$k] = preg_grep("/^$k/", $array2[0]);
}

答案 2 :(得分:0)

好吧,在这种情况下,simpleelegant的方式在我看来都不太可能,因为这可能是基于观点的。简单的foreach是实现此目的的最简单,最有效的方法。但是,为了优雅起见,您可以使用array_walkarray_fillarray_combine来实现。

<?php

$arr1 = Array(
    Array
        (
            'C1',
            'C1',
            'C1',
            'AC',
            'AC'
    )
);

$arr2 = Array(
    Array(
            'C1_complete',
            'C1_29-95',
            'C1_49-95',
            'AC_complete',
            'AC_29-95'
    )
);


$data = array_combine(array_values($arr1[0]),array_fill(0,count($arr1[0]),[]));

array_walk($arr2[0],function($value) use (&$data){
    if(isset($data[explode("_",$value)[0]])) $data[explode("_",$value)[0]][] = $value;
});

$data = [$data]; // since you want it inside another array.

print_r($data);

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