亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將數組分解成多維數組(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 關注
  • 180 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號