Usando arrays multidimensionais do PHP para converter o MySQL em JSON

Aqui está a estrutura da minha mesa.

Estou tentando converter o MySQL em JSON nested, mas estou tendo problemas para descobrir como construir a multidimensional array em PHP.

O resultado que eu quero é semelhante a este:

[ { "school_name": "School's Name", "terms": [ { "term_name":"FALL 2013", "departments": [ { "department_name":"MANAGEMENT INFO SYSTEMS", "department_code":"MIS", "courses": [ { "course_code":"3343", "course_name":"ADVANCED SPREADSHEET APPLICATIONS", "sections": [ { "section_code":"18038", "unique_id": "mx00fdskljdsfkl" }, { "section_code":"18037", "unique_id": "mxsajkldfk57" } ] }, { "course_code":"4370", "course_name":"ADVANCED TOPICS IN INFORMATION SYSTEMS", "sections": [ { "section_code":"18052", "unique_id": "mx0ljjklab57" } ] } ] } ] } ] } ] 

O PHP que estou usando:

 $query = "SELECT school_name, term_name, department_name, department_code, course_code, course_name, section_code, magento_course_id FROM schools INNER JOIN term_names ON schools.id=term_names.school_id INNER JOIN departments ON schools.id=departments.school_id INNER JOIN adoptions ON departments.id=adoptions.department_id"; $fetch = mysqli_query($con, $query) or die(mysqli_error($con)); $row_array = array(); while ($row = mysqli_fetch_assoc($fetch)) { $row_array[$row['school_name']]['school_name'] = $row['school_name']; $row_array[$row['school_name']]['terms']['term_name'] = $row['term_name']; $row_array[$row['school_name']]['terms']['departments'][] = array( 'department_name' => $row['department_name'], 'department_code' => $row['department_code'], 'course_name' => $row['course_name'], 'course_code' => $row['course_code'], 'section_code' => $row['section_code'], 'unique_id' => $row['magento_course_id'] ); } $return_arr = array(); foreach ($row_array as $key => $record) { $return_arr[] = $record; } file_put_contents("data/iMadeJSON.json" , json_encode($return_arr, JSON_PRETTY_PRINT)); 

Meu JSON parece assim:

 [ { "school_name": "School's Name", "terms": { "term_name": "FALL 2013", "departments": [ { "department_name": "ACCOUNTING", "department_code": "ACCT", "course_name": "COST ACCOUNTING", "course_code": "3315", "section_code": "10258", "unique_id": "10311" }, { "department_name": "ACCOUNTING", "department_code": "ACCT", "course_name": "ACCOUNTING INFORMATION SYSTEMS", "course_code": "3320", "section_code": "10277", "unique_id": "10314" }, ... 

As informações do departamento são repetidas para cada curso, tornando o arquivo muito maior. Estou procurando uma melhor compreensão de como os arrays multidimensionais do PHP em conjunto com o JSON funcionam, porque, aparentemente, não tenho ideia.

Tente replace o loop while com o código abaixo:

 $departments = array(); $courses = array(); $i = 0; $j = 0; while ($row = mysqli_fetch_assoc($fetch)) { $row_array[$row['school_name']]['school_name'] = $row['school_name']; $row_array[$row['school_name']]['terms']['term_name'] = $row['term_name']; $key = array_search($row['department_code'], $departments); if ($key === FALSE) { $k = $i++; $departments[] = $row['department_code']; $row_array[$row['school_name']]['terms']['departments'][$k]['department_name'] = $row['department_name']; $row_array[$row['school_name']]['terms']['departments'][$k]['department_code'] = $row['department_code']; } else { $k = $key; } $skey = array_search($row['course_code'], $courses); if ($skey === FALSE) { $l = $j++; $courses[] = $row['course_code']; $row_array[$row['school_name']]['terms']['departments'][$k]['courses'][$l]['course_name'] = $row['course_name']; $row_array[$row['school_name']]['terms']['departments'][$k]['courses'][$l]['course_code'] = $row['course_code']; } else { $l = $skey; } $row_array[$row['school_name']]['terms']['departments'][$k]['courses'][$l]['sections'][] = array('section_code' => $row['section_code'], 'unique_id' => $row['magento_course_id']); } 

Espero que isso possa ajudá-lo.

Eu sei que esta é uma espécie de pergunta antiga, mas hoje eu estava com o mesmo problema. Não encontrei uma solução adequada on-line e finalmente resolvi, então estou postando aqui para que outros possam verificar.

Não tenho 100% de certeza de que isso funcionará porque eu não tenho seu database, mas no meu caso foi semelhante e funcionou. Também não será 100%, como foi perguntado, mas tenho certeza de que não haverá redundância e todos os dados serão exibidos.

 while ($row = mysqli_fetch_assoc($fetch)) { $row_array ['school_name'][$row['school_name']]['terms'][$row['term_name']]['departments']['department_code'][$row['department_code']]['department_name'] = $row['department_name']; $row_array ['school_name'][$row['school_name']]['terms'][$row['term_name']]['departments']['department_code'][$row['department_code']]['courses']['course_code'][$row['course_code']]['course_name'] = $row['course_name']; $row_array ['school_name'][$row['school_name']]['terms'][$row['term_name']]['departments']['department_code'][$row['department_code']]['courses']['course_code'][$row['course_code']]['sections']['unique_id'][$row['magento_course_id']]['section_code'] = $row['section_code']; } 

Também não sou um PHP, mas do que entendo, o = vem antes de uma folha e somente antes de uma folha.

Comecei com a resposta de Ian Mustafa e descubro para resolver o problema de cada ciclo que apaga a matriz anterior.

É um tópico antigo, mas acho que isso pode ser útil para outros, então aqui está a minha solução, mas com base na minha própria estrutura de dados (é fácil descobrir como adaptá-lo a outras estruturas que penso):

 $usersList_array =array(); $user_array = array(); $note_array = array(); $fetch_users = mysqli_query($mysqli, "SELECT ID, Surname, Name FROM tb_Users WHERE Name LIKE 'G%' ORDER BY ID") or die(mysqli_error($mysqli)); while ($row_users = mysqli_fetch_assoc($fetch_users)) { $user_array['id'] = $row_users['ID']; $user_array['surnameName'] = $row_users['Surname'].' '.$row_users['Name']; $user_array['notes'] = array(); $fetch_notes = mysqli_query($mysqli, "SELECT id, dateIns, type, content FROM tb_Notes WHERE fk_RefTable = 'tb_Users' AND fk_RefID = ".$row_users['ID']."") or die(mysqli_error($mysqli)); while ($row_notes = mysqli_fetch_assoc($fetch_notes)) { $note_array['id']=$row_notes['id']; $note_array['dateIns']=$row_notes['dateIns']; $note_array['type']=$row_notes['type']; $note_array['content']=$row_notes['content']; array_push($user_array['notes'],$note_array); } array_push($usersList_array,$user_array); } $jsonData = json_encode($usersList_array, JSON_PRETTY_PRINT); echo $jsonData; 

JSON resultante:

 [ { "id": "1", "surnameName": "Xyz Giorgio", "notes": [ { "id": "1", "dateIns": "2016-05-01 03:10:45", "type": "warning", "content": "warning test" }, { "id": "2", "dateIns": "2016-05-18 20:51:32", "type": "error", "content": "error test" }, { "id": "3", "dateIns": "2016-05-18 20:53:00", "type": "info", "content": "info test" } ] }, { "id": "2", "cognomeNome": "Xyz Georg", "notes": [ { "id": "4", "dateIns": "2016-05-20 14:38:20", "type": "warning", "content": "georg warning" }, { "id": "5", "dateIns": "2016-05-20 14:38:20", "type": "info", "content": "georg info" } ] } ] 

Altere o seu while para isso:

 while ($row = mysqli_fetch_assoc($fetch)) { $row_array[$row['school_name']]['school_name'] = $row['school_name']; $row_array[$row['school_name']]['terms']['term_name'] = $row['term_name']; $row_array[$row['school_name']]['terms']['department_name'][] = array( 'department_name' => $row['department_name'], 'department_code' => $row['department_code'] ); } 

Editar

Se você deseja obter resultados como o exemplo, talvez você considere usar este método:

  

Provavelmente não é um programa eficaz, mas deve dar-lhe o melhor resultado. Espero que ajude 🙂