phpmultidimensional-arrayyii

Multi dimensional array in YII2


I have been trying to create a folder concept in my application.
I tried to return the o/p in json format for APi. I am trying to list the folder,sub folder and the files in sub folder,but when I tried to nested array like this

{
  "success_msg": 1,
  "message": "success",
  "details": [
    {
      "foldername": "Test_folder_1",
      "subfolder": [
        {
          "sub_folder_name": "Test_sub_folder_1",

      "subfile": [
        {
          "filename": "test_1.pdf"
        },
        {
          "filename": "test_2.pdf"
        }
      ]
        },
        {
          "sub_folder_name": "test_folder",
 "subfile": [
        {
          "filename": "test_3.jpg"
        }
      ]
        }
      ]
    }
  ]
}

I am getting wrong o/p.Let me share with you that

{
  "success_msg": 1,
  "message": "success",
  "details": [
    {
      "foldername": "Test_folder_1",
      "subfolder": [
        {
          "sub_folder_name": "Test_sub_folder_1"
        },
        {
          "sub_folder_name": "test_folder"
        }
      ],
      "subfile": [
        {
          "filename": "test_1.pdf"
        },
        {
          "filename": "test_2.pdf"
        },
        {
          "filename": "test_3.jpg"
        }
      ]
    },
    {
      "foldername": "sample_folder",
      "subfolder": [],
      "subfile": []
    }
  ]
}  

And this is my action

public function actionFiles() {
    ob_start();
    $raw = file_get_contents("php://input");
    $obj = json_decode($raw);
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    if ($obj!=null){  
        $user_id            = $obj->cur_user_id;
        $user_model         = User::find()->where(['id'=>$user_id])->one();
        $developer_id       = $user_model->createdby;
        $folder_model       = Folder::find()->where(['developerid'=>$developer_id,'foldertype'=>'parent'])->all();
        $count_folder       = count($folder_model);
        if($count_folder > '0'){
            $response = ['success_msg' => 1, 'message' => 'success', 'details' => []];
            foreach($folder_model as $folder) {
                $folder_id                          = $folder['id'];
                $userdet['foldername']              = $folder['foldername'];
                $sub = [];
                $sub_files = [];
            $subfolder_model = Folder::find()->where(['folderid'=>$folder_id])->all();
            foreach ($subfolder_model as $subfolder) {
                $sub_folder_id              = $subfolder['id'];
                $sub_name['sub_folder_name'] = $subfolder['foldername'];
            $sub_file = Files::find()->where(['folderid'=>$folder_id,'subfolderid'=>$sub_folder_id])->all();
            foreach ($sub_file as $file) {
                $filename['filename'] = $file['filename'];
                array_push($sub_files, $filename);
            }
                array_push($sub, $sub_name);                
                // echo '<pre>';print_r($userdet);
            }

                $userdet['subfolder'] = $sub;               
                $userdet['subfile'] = $sub_files;
                array_push($response['details'], $userdet);

            }
            echo json_encode($response);
        }else {
                // failed to insert row  
            $response["success_msg"] = 2;
            $response["message"] = "No News found";
            echo json_encode($response);
        }

    } else {
        $response["success_msg"] = 3;
        $response["message"] = "Data missing";
        echo json_encode($response);
    }
}  

Can anyone tell me how can I insert sub file array in sub folder array...
thanks in advance..


Solution

  • I updated the code with some changes in position of the arrays.

    if ($count_folder > '0') {
                    $response = ['success_msg' => 1, 'message' => 'success', 'details' => []];
                    foreach ($folder_model as $folder) {
                        $folder_id              = $folder['id'];
                        $userdet['foldername']  = $folder['foldername'];
                        $sub                    = [];
                        $subfolder_model        = Folder::find()->where(['folderid' => $folder_id])->all();
                        foreach ($subfolder_model as $subfolder) {
                        $sub_files              = [];
                            $sub_folder_id                  = $subfolder['id'];
                            $sub_name['sub_folder_name']    = $subfolder['foldername'];
                            $sub_file = Files::find()->where(['folderid' => $folder_id, 'subfolderid' => $sub_folder_id])->all();
                                echo '<pre>';print_r($sub_file);
    
                            foreach ($sub_file as $file) {
                                $filename['filename']       = Yii::$app->urlManager->createAbsoluteUrl('uploads/' . $file['filename']);
                                array_push($sub_files, $filename);
                            }
                            $sub_name['subfile']            = $sub_files;
                            array_push($sub, $sub_name);
                        }
    
                        $userdet['subfolder'] = $sub;
                        array_push($response['details'], $userdet);
                    }
                    echo json_encode($response);