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

将数组分解成多维数组(parent->child->sub-child)

将数组分解成多维数组(parent->child->sub-child)

PHP
慕婉清6462132 2023-05-12 14:47:24
我有一个数组($categories_final),看起来类似于:Array(    [0] => Accessories/Apron    [1] => Accessories/Banners    [2] => Accessories/Belts    [3] => Brand/Brand1    [4] => Brand/Brand2    [5] => Apparel/Men/Belts    [6] => Apparel/Men/Socks    [7] => Apparel/Women/Leggings)我试图让它看起来像这样,所以我可以将它作为我商店的类别结构添加到数据库中:Array(    [Accessories] => Array        (            [0] => Apron            [1] => Banners            [2] => Belts        )    [Apparel] => Array        (            [0] => Men => Array                (                    [0] => Belts                    [1] => Socks                )            [1] => Women => Array                (                    [0] => Leggings                )        )        ...etc这是我到目前为止所得到的,但我无法弄清楚如何在 Men/ & Women/ 下添加孩子:$categories = array();foreach ($categories_final as $cat) {    $levels = explode('/', $cat);    if (isset($categories[$levels[0]])) {        if (!in_array($levels[1], $categories[$levels[0]])) {            $categories[$levels[0]][]= $levels[1];        }    }    else {        $categories[$levels[0]][]= $levels[1];    }}print_r($categories);再一次,我坚持如何在他们各自的父母下添加 /Belts、/Socks 和 /Leggings。任何帮助表示赞赏,谢谢!
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

由于可以有无限数量的分支,您可能应该有一个递归解决方案。我尽了最大努力得到了这段代码:


$arr = ['Accessories/Apron', 'Accessories/Banners', 'Accessories/Belts','Brand/Brand1','Brand/Brand2',

        'Apparel/Men/Belts', 'Apparel/Men/Socks', 'Apparel/Women/Leggings'];


$final = [];

foreach ($arr as $branch) {

    $temp = branchRecursive($branch);

    $final = array_merge_recursive($final, $temp);

}




function branchRecursive($branch) {

    // explode only first

    $newBranch = explode('/', $branch, 2);


    // A leaf, no more branches

    if(count($newBranch) != 2) {


        return $newBranch[0];

    }


    $array [ $newBranch[0] ]= branchRecursive($newBranch[1]);

    return $array;


}

它返回这个:


Array

(

    [Accessories] => Array

        (

            [0] => Apron

            [1] => Banners

            [2] => Belts

        )


    [Brand] => Array

        (

            [0] => Brand1

            [1] => Brand2

        )


    [Apparel] => Array

        (

            [Men] => Array

                (

                    [0] => Belts

                    [1] => Socks

                )


            [Women] => Leggings

        )


)

与您的代码唯一不同的是


[Women] => Leggings

代替


[0] => Leggings

但我想睡觉,但我的脑袋不工作,所以如果有人能指出要改变的地方,我将不胜感激。我希望这不是什么大问题:)


查看完整回答
反对 回复 2023-05-12
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

此代码使您能够创建任意数量的子分支。


$source = array('Accessories/Apron ' ,

        'Accessories/Banners',

        'Accessories/Belts',

        'Brand/Brand1',

        'Brand/Brand2',

        'Apparel/Men/Belts',

        'Apparel/Men/Socks',

        'Apparel/Women/Leggings'

    );


function convert($categories_final) {

    $categories = array();

    foreach ($categories_final as $cat) {

        $levels = explode('/', $cat);

        // get category

        $category_name = $levels[0];

        array_shift($levels);

        if(!array_key_exists($category_name,$categories)) {

            $categories[$category_name] = array();

        }

        $tmp = &$categories[$category_name] ;

        foreach($levels as $index => $val){

            if($index + 1 === count($levels) ){

                $tmp[] = $val; 

            } else {

                $i = find_index($tmp , $val);

                if( $i == count($tmp) ) { // object not found , we create a new sub array

                    $tmp[] = array($val => array());

                }

                $tmp = &$tmp[$i][$val];

            }

        }


    }

    return $categories;

}


function find_index($array , $key) {

    foreach($array as $i => $val ) {

        if(is_array($val) && array_key_exists($key , $val) ){

            return $i ;

        }

    }

    return count($array);

}


print_r(convert($source));

这是结果


Array

(

    [Accessories] => Array

        (

            [0] => Apron 

            [1] => Banners

            [2] => Belts

        )

    [Brand] => Array

        (

            [0] => Brand1

            [1] => Brand2

        )


    [Apparel] => Array

        (

            [0] => Array

                (

                    [Men] => Array

                        (

                            [0] => Belts

                            [1] => Socks

                        )

                )

            [1] => Array

                (

                    [Women] => Array

                        (

                            [0] => Leggings

                        )

                )

        )


)


查看完整回答
反对 回复 2023-05-12
?
温温酱

TA贡献1752条经验 获得超4个赞

一种方法是将数组项“转换”为 json,然后解码为数组。


我首先执行中间步骤,其中字符串变为无效的 json,然后 preg_replace 使内部变为{}有效[]。

然后与结果合并。


$result =[];

foreach($arr as $val){

    $count = count(explode("/", $val));

    $str = '{"' . str_replace('/', '":{"', $val) . '"}' . str_repeat("}", $count-1);

    $json = preg_replace("/(.*)(\{)(.*?)(\})/", "$1[$3]", $str);

    $result = array_merge_recursive($result, json_decode($json, true));

}


Print_r($result);

https://3v4l.org/5i3SW


查看完整回答
反对 回复 2023-05-12
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信