1

I have some issue. I need to resize my array in a proper format using PHP. I am giving my data below.

$result = Array
(
    [0] => Array
        (
            [cat_id] => 2
            [cat_name] => spirit
            [subcat_id] => 20
            [subcat_name] => pizza
        )

    [1] => Array
        (
            [cat_id] => 2
            [cat_name] => spirit
            [subcat_id] => 22
            [subcat_name] => wine
        )

    [2] => Array
        (
            [cat_id] => 3
            [cat_name] => Food
            [subcat_id] => 23
            [subcat_name] => pakhal
        )

    [3] => Array
        (
            [cat_id] => 3
            [cat_name] => Food
            [subcat_id] => 24
            [subcat_name] => fuddy
        )

);

The above array should be arranged in the below format.

$data = [{
            "category" : "Spirits",
            'cat_id' : 2,
            "subCatgory" : [{
                    "id" : "20",
                    "name" : "pizza"
                },
                {
                    "id" : "22",
                    "name" : "wine"
                }]
        },
        {
            "category" : "Food",
            "cat_id" : "3",
            "subCatgory" : [{
                    "id" : "23",
                    "name" : "pakhal"
                },
                {
                    "id" : "24",
                    "name" : "fuddy"
                }]
        }]

I did like below but its not giving the required format.

<?php
  $result=array(array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'20','subcat_name'=>'pizza'),array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'22','subcat_name'=>'wine'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'23','subcat_name'=>'pakhal'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'24','subcat_name'=>'fuddy'));

  for($i=0;$i<count($result);$i++){
      if($i==0){
          $data[]=array("category"=>$result[$i]['cat_name'],"cat_id"=>$result[$i]['cat_id'],"subCatgory"=>array(array("id"=>$result[$i]['subcat_id'],"name"=>$result[$i]['subcat_name']))); 
      }else{

        for($j=0;$j<count($data);$j++){
              if($data[$j]['cat_id']==$result[$i]['cat_id']){
                  for($k=0;$k<count($data[$j]['subCatgory']);$k++){
                      if($data[$j]['subCatgory'][$k]['id']==$result[$i]['subcat_id']){
                          $find=1;
                          break;
                      }else{
                          $find=0;
                      }

                  }
                  if($find==0){
                    $data[$j]['subCatgory'][]=array("id"=>$result[$i]['subcat_id'],"name"=>$result[$i]['subcat_name']);
                  }
                  if($find==1){
                      break;
                  }

              }else{
                  $data[]=array("category"=>$result[$i]['cat_name'],"cat_id"=>$result[$i]['cat_id'],"subCatgory"=>array(array("id"=>$result[$i]['subcat_id'],"name"=>$result[$i]['subcat_name'])));

              }

          }
      }
  }
 echo json_encode($data);
?>

The above code is giving the wrong format. Please help me.

Ketav
  • 760
  • 1
  • 8
  • 27
  • 4
    Possible duplicate of [How to sort array as per key value using PHP](http://stackoverflow.com/questions/39469531/how-to-sort-array-as-per-key-value-using-php) – Patrick Mlr Sep 14 '16 at 05:34
  • But there was no response. –  Sep 14 '16 at 05:36
  • Whats the output you get from your code? Can you add to your post? – rbr94 Sep 14 '16 at 05:37
  • 1
    @subhra Thats no reason to duplicate a question. Be patient. – Patrick Mlr Sep 14 '16 at 05:39
  • i am getting this output `[{"category":"spirit","cat_id":"2","subCatgory":[{"id":"20","name":"pizza"},{"id":"22","name":"wine"}]},{"category":"Food","cat_id":"3","subCatgory":[{"id":"23","name":"pakhal"},{"id":"24","name":"fuddy"}]},{"category":"Food","cat_id":"3","subCatgory":[{"id":"24","name":"fuddy"}]}]` which not required format. –  Sep 14 '16 at 05:39
  • Possible duplicate of [Sort Multi-dimensional Array by Value](http://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value) – A. L Sep 14 '16 at 05:49
  • Issue is in this line `if($data[$j]['cat_id']==$result[$i]['cat_id']){` where you check for `$data[2]['catid']==$result[$i]['cat_id']` but your category is present already in `$data[1]['catid']` and hence the final element is added again. Make a workaround for that to check if the category is already present in the array rather than checking if its present at `$data[2]` – Sasikumar Sep 14 '16 at 06:03
  • @Sasikumar : Can you please make this correct. –  Sep 14 '16 at 06:04
  • i had explained the scenario and the place of issue just try yourself. – Sasikumar Sep 14 '16 at 06:05

4 Answers4

1
        $result=array(array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'20','subcat_name'=>'pizza'),array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'20','subcat_name'=>'pizza'),array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'22','subcat_name'=>'wine'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'23','subcat_name'=>'pakhal'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'24','subcat_name'=>'fuddy')); 
        $ids= array();
        $unique_ids=array();
        $output=array();        
        foreach ($result as $res) {
            array_push($ids,$res['cat_id']);                       
        } 
        $unique_ids=array_unique($ids);
        foreach ($unique_ids as $key=>$uid) { 
            $sub=array();
            foreach ($result as $res) {                              
                if($res['cat_id']==$uid)
                {
                    $name=$res['cat_name'];  
                    array_push($sub, array("id"=>$res['subcat_id'], "name"=>$res['subcat_name']));
                }
             }
             array_push($output, array("category"=>$name, "cat_id"=>$uid,"subCategory"=> array_values(array_unique($sub,SORT_REGULAR))));
        }
        var_dump(json_encode($output));
0

Here I have write your solution :

    <?php   
    $result = array(
        array( 
            'cat_id' => '2',
            'cat_name' => 'spirit',
            'subcat_id' => '20',
            'subcat_name' => 'pizza'
        ),
        array(
            'cat_id' => '2',
            'cat_name' => 'spirit',
            'subcat_id' => '20',
            'subcat_name' => 'pizza'
        ),
        array(
            'cat_id' => '2',
            'cat_name' => 'spirit',
            'subcat_id' => '22',
            'subcat_name' => 'wine'
        ),
        array(
            'cat_id' => '3',
            'cat_name' => 'Food',
            'subcat_id' => '23',
            'subcat_name' => 'pakhal'
        ),
        array(
            'cat_id' => '3',
            'cat_name' => 'Food',
            'subcat_id' => '24',
            'subcat_name' => 'fuddy'
        )
    );

$finalArr = array();
foreach($result as $arr) {
    $finalArr[] = array(
        'category' => $arr['cat_name'],
        'cat_id' => $arr['cat_id']
    );
    $subCatArr[$arr['cat_id']][] = array(
        'id' => $arr['subcat_id'],
        'name' => $arr['subcat_name']
    ); 
}

foreach($subCatArr as $key => $sub) {
    $subCatArr[$key] = array_map("unserialize", array_unique(array_map("serialize", $sub)));
}

$finalArr = array_map("unserialize", array_unique(array_map("serialize", $finalArr)));



foreach($finalArr as $key => $a) {
    if(array_key_exists($a['cat_id'],$subCatArr)) {
        $finalArr[$key]['subCatgory'] = array_values($subCatArr[$a['cat_id']]);
    }
}

echo json_encode(array_values($finalArr));

Please try this.

Hardik Patel
  • 706
  • 5
  • 14
  • your code giving the result `{"0":{"category":"spirit","cat_id":"2","subCatgory":[{"id":"20","name":"pizza"},{"id":"22","name":"wine"}]},"3":{"category":"Food","cat_id":"3","subCatgory":[{"id":"23","name":"pakhal"},{"id":"24","name":"fuddy"}]}}`.Here i dont need index like `0,3`. –  Sep 14 '16 at 06:09
  • I know but I am thinking about same – Hardik Patel Sep 14 '16 at 06:09
0

You can try this :

<?php
$array  = array(array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'20','subcat_name'=>'pizza'),array('cat_id'=>'2','cat_name'=>'spirit','subcat_id'=>'22','subcat_name'=>'wine'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'23','subcat_name'=>'pakhal'),array('cat_id'=>'3','cat_name'=>'Food','subcat_id'=>'24','subcat_name'=>'fuddy'));
$result = array();
$subCat = array();

foreach($array as $key => $val) {
    /** Here we build a sub category structure */
    $subCat = array('id' => $val['subcat_id'], 'name' => $val['subcat_name'],);

    /** Here we build the rest */
    $result[$val['cat_id']]['category']         = $val['cat_name'];
    $result[$val['cat_id']]['cat_id']           = $val['cat_id'];
    $result[$val['cat_id']]['subCategory'][]    = $subCat;
}

$result = array_values($result);
print_r(json_encode($result));
Tri Hartanto
  • 181
  • 4
0

You could try the function below... Quick-Test Here...

<?php


    $arr = [
        [
            "cat_id"        => 2,
            "cat_name"      => "spirit",
            "subcat_id"     => 20,
            "subcat_name"   => "pizza",
        ],
        [
            "cat_id"        => 2,
            "cat_name"      => "spirit",
            "subcat_id"     => 22,
            "subcat_name"   => "wine",
        ],
        [
            "cat_id"        => 3,
            "cat_name"      => "Food",
            "subcat_id"     => 23,
            "subcat_name"   => "pakhal",
        ],
        [
            "cat_id"        => 3,
            "cat_name"      => "Food",
            "subcat_id"     => 24,
            "subcat_name"   => "fuddy",
        ]
    ];

    function groupByCatID($arr){
        $groups = [];
        foreach($arr as $k=>$subArr){
            $subCat  = [
                "id"    => $subArr['subcat_id'],
                "name"  => $subArr['subcat_name'],

            ];
            $tmpArr = [
                "category"      => $subArr['cat_name'],
                'cat_id'        => $subArr['cat_id'],
                "subCategory"    => [],
            ];
            if(is_array($subArr)){
                if(!array_key_exists($subArr['cat_name'], $groups)){
                    $groups[$subArr['cat_name']]    = [];
                    $groups[$subArr['cat_name']]    = $tmpArr;
                    $groups[$subArr['cat_name']]['subCategory'][0] = $subCat;
                }else{
                    $groups[$subArr['cat_name']]['subCategory'][] = $subCat;
                }
            }
        }
        return json_encode(array_values($groups));
    }

    var_dump( groupByCatID($arr));  
    //PRODUCES:
    '[
        {"category":"spirit",
        "cat_id":2,"subCategory":[
                        {"id":20,"name":"pizza"},
                        {"id":22,"name":"wine"}
                ]
            },

        {"category":"Food",
        "cat_id":3,"subCategory":[
                    {"id":23,"name":"pakhal"},
                    {"id":24,"name":"fuddy"}
                ]
            }
    ]'
Poiz
  • 7,611
  • 2
  • 15
  • 17