按类别分组数组

I am facing problem In grouping array with the Key:- I have an php array Which has following elecment in it.

$array = array(
    '0' => array ( 'id' => 'food,Travel', 'names' => 'chimpanzee' ),
    '1' => array ( 'id' => 'food', 'name' => 'meeting' ),
    '2' => array ( 'id' => 'Z1', 'name' => 'dynasty' ),
    '3' => array ( 'id' => 'X', 'name' => 'chocolate' ),
    '4' => array ( 'id' => 'Travel', 'name' => 'bananas' ),
    '5' => array ( 'id' => 'Travel', 'name' => 'fantasy' ),
    '6' => array ( 'id' => 'Travel', 'name' => 'football' )
);

When I try with following code:-

$newarray= array();
foreach($array as $key => $value){
    $newarray[$value['id']][$key] = $value;
}

I am getting below result Array Here food,travel is created another array but I want to please those to respective category "Food goes to food" and travel goes to travel"

 (
    [food,Travel] => Array
        (
            [0] => Array
                (
                    [id] => food,Travel
                    [names] => chimpanzee
                )

        )

    [food] => Array
        (

[1] => Array

                    [id] => food,Travel
                    [names] => chimpanzee
                )  
(
                    [id] => food
                    [name] => meeting
                )


        )

    [Z1] => Array
        (
            [2] => Array
                (
                    [id] => Z1
                    [name] => dynasty
                )

        )

    [X] => Array
        (
            [3] => Array
                (
                    [id] => X
                    [name] => chocolate
                )

        )

    [Travel] => Array
        (
            [4] => Array
                (
                    [id] => Travel
                    [name] => bananas
                )

            [5] => Array
                (
                    [id] => Travel
                    [name] => fantasy
                )

            [6] => Array
                (
                    [id] => Travel
                    [name] => football
                )

        )

)

But I am want following result:- Food should Go to food category and travels should go to travels category like:-

Array
(
    [food] => Array

    (
            // Food should come at food category 
            [0] => Array
                (
                    [id] => food
                    [names] => chimpanzee
                )

        )

        (
            [1] => Array
                (
                    [id] => food
                    [name] => meeting
                )

        )

    [Z1] => Array
        (
            [2] => Array
                (
                    [id] => Z1
                    [name] => dynasty
                )

        )

    [X] => Array
        (
            [3] => Array
                (
                    [id] => X
                    [name] => chocolate
                )

        )

    [Travel] => Array
        (
            ( // Travel should come at travel category
            [0] => Array
                (
                    [id] => food
                    [names] => chimpanzee
                )

            )
            [4] => Array
                (
                    [id] => Travel
                    [name] => bananas
                )

            [5] => Array
                (
                    [id] => Travel
                    [name] => fantasy
                )

            [6] => Array
                (
                    [id] => Travel
                    [name] => football
                )

        )

)

review fragment

$newArray= [];
foreach($array as $mainKey => $value){

    $keys = explode(',', $value['id']);

    $tmpKeys = array_keys($value);
    $valueKey = array_pop($tmpKeys);
    $names = array_pop($value);

    if (count($keys) > 1) {
        $TravelExist = false;
        foreach ($keys as $key) {
            if ($key == 'Travel') {
                $TravelExist = true;
            }
            $newArray[$key][$mainKey] = [
                'id' => $key,
                $valueKey=> $names,
            ];
        }
        if ($TravelExist) {
            foreach ($keys as $key) {
                if ($key == 'Travel') {
                    continue;
                }
                $newArray['Travel'][$mainKey] = [
                    'id' => $key,
                    $valueKey=> $names,
                ];
            }
        }
        continue;
    }

    $newArray[(!count($keys)) ? 'empty':$value['id']][$mainKey]  = [
        'id' => (!count($keys)) ? 'empty':$value['id'],
        $valueKey=> $names,
    ];
}

When id has ,, just explode it, check the demo

$result = [];
foreach($array as $k => $v){
    if(strpos($v["id"],",")) {
        $ids = explode(",", $v["id"]);
        foreach ($ids as $id) {
            $result[$id][$k] = $v;
        }
    }else{
        $result[$v["id"]][$k] = $v;
    }
}
var_dump($result);

No need to make it complex, like some have suggested, use explode()

https://3v4l.org/jVK6j

$newarray= [];

foreach($array as $key => $value) {

    if(is_array(explode(",", $value["id"]))) {
        foreach(explode(",", $value["id"]) as $category) {
            $newarray[$category][$key] = $value;
            $newarray[$category][$key]["id"] = $category;
        }
    } else {
        $newarray[$value["id"]][$key] = $value;
    }

}

var_dump($newarray);

You could even remove $key since these will be auto incremented.

foreach($array as $value) {

    if(is_array(explode(",", $value["id"]))) {
        foreach(explode(",", $value["id"]) as $category) {
            $value["id"] = $category;
            $newarray[$category][] = $value;
        }
    } else {
        $newarray[$value["id"]][] = $value;
    }

}