为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
跃然一笑 2021-11-13 18:55:20
我想合并数组的顶层,以便共享同一父级的第二级的所有值形成该父级的单个数组。数组 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 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

如果我只使用数组 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>';

输出保持不变。


查看完整回答
反对 回复 2021-11-13
?
森林海

TA贡献2011条经验 获得超2个赞

对于您的数组,您不需要第一个循环,但如果您的数组中有多个数组。只需循环和 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]);

}


查看完整回答
反对 回复 2021-11-13
?
慕斯709654

TA贡献1840条经验 获得超5个赞

那么,这两个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


查看完整回答
反对 回复 2021-11-13
  • 3 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号