【问题标题】:Using PHP multidimensional arrays to convert MySQL to JSON使用 PHP 多维数组将 MySQL 转换为 JSON
【发布时间】:2014-08-23 12:08:18
【问题描述】:

Here's my table structure.

我正在尝试将 MySQL 转换为嵌套 JSON,但无法弄清楚如何在 PHP 中构建多维数组。

我想要的结果是这样的:

[
{
    "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"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
} 
]

我正在使用的 PHP:

$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));

我的 JSON 如下所示:

[
{
    "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"
            },
            ...

每门课程都重复部门信息,使文件变得更大。我希望更好地了解 PHP 多维数组与 JSON 结合的工作原理,因为我显然不知道。

【问题讨论】:

    标签: php mysql arrays json multidimensional-array


    【解决方案1】:

    将您的 while 更改为:

    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']
        );
    }
    

    编辑

    如果你想达到例子中的效果,也许你应该考虑使用这种方法:

    <?php
    
    $result_array = array();
    
    $fetch_school = mysqli_query($con, "SELECT id, school_name FROM schools") or die(mysqli_error($con));
    while ($row_school = mysqli_fetch_assoc($fetch_school)) {
        $result_array['school_name'] = $row_school['school_name'];
    
        $fetch_term = mysqli_query($con, "SELECT term_name FROM term_names WHERE school_id = $row_school['id']") or die(mysqli_error($con));
        while ($row_term = mysqli_fetch_assoc($fetch_term)) {
            $result_array['terms']['term_name'] = $row_term['term_name'];
    
            $fetch_dept = mysqli_query($con, "SELECT id, department_name, department_code FROM departments WHERE school_id = $row_school['id']") or die(mysqli_error($con));
            while ($row_dept = mysqli_fetch_assoc($fetch_dept)) {
                $result_array['terms']['deptartments']['department_name'] = $row_dept['department_name'];
                $result_array['terms']['deptartments']['department_code'] = $row_dept['department_code'];
    
                $fetch_course = mysqli_query($con, "SELECT course_name, course_code FROM adoptions WHERE departement_id = $row_dept['id']") or die(mysqli_error($con));
                while ($row_course = mysqli_fetch_assoc($fetch_course)) {
                    $result_array['terms']['deptartments']['courses']['course_name'] = $row_course['course_name'];
                    $result_array['terms']['deptartments']['courses']['course_code'] = $row_course['course_code'];
                }
            }
        }
    }
    
    file_put_contents("data/iMadeJSON.json" , json_encode($result_array, JSON_PRETTY_PRINT));
    

    可能它不是一个有效的程序,但它应该会给你最好的结果。希望对你有帮助:)

    【讨论】:

    • 这不是我所需要的。您的代码导致每个课程的部门名称重复,但我希望课程嵌套在各自的部门内。 e:不是在,而是在下面,就像我问题开头的 JSON 示例一样。
    • 然后我们需要修改你的整个SELECT查询,先选择父数组,然后加载子数组。我会尽快修改我的答案。
    • @user3798310 我添加了另一种方法。也许你想试一试:)
    • 这绝对是正确的格式。唯一的问题是每个循环都会擦除前面的数组,所以只有最后一个部门的最后一门课程被打印到 JSON 中。看来我比以前更接近了,所以谢谢。
    【解决方案2】:

    尝试用下面的代码替换你的while循环:

    $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']);
    }
    

    希望这会对你有所帮助。

    【讨论】:

    • 第一个部门完美无缺,但之后的每门课程看起来都是这样的...... "department_name": "ART", "department_code": "ART", "courses": { "28 ": { "course_name": ... "28" 键是问题所在。
    • 能否分享您的表结构和示例数据?
    • 首先,抱歉花了整个周末。其次,我不确定这样做的首选方式是什么,所以这里有一个链接docs.google.com/spreadsheets/d/…
    【解决方案3】:

    我知道这是一个老问题,但今天我遇到了同样的问题。网上没找到合适的解决办法,终于解决了,所以发在这里让别人看看。

    我不能 100% 确定这会奏效,因为我没有您的数据库,但在我的情况下是类似的并且有效。此外,它不会像被要求的那样 100%,但我很确定不会有冗余,所有数据都会显示出来。

    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'];
    }
    

    另外,我不是 PHP 人,但据我了解,= 出现在叶子之前且仅在叶子之前。

    【讨论】:

      【解决方案4】:

      我从Ian Mustafa reply开始,想办法解决每个循环擦除前一个数组的问题。

      这是一个旧线程,但我认为这可能对其他人有用,所以这是我的解决方案,但基于我自己的数据结构(很容易弄清楚如何使其适应我认为的其他结构):

      $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:

      [
      {
          "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"
              }
          ]
      }
      ]
      

      【讨论】:

      • 像宝石一样工作,为我节省了大量时间,谢谢!
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多