用 PHP 将一个 mysqli 表转换为 JSON 格式

Posted

技术标签:

【中文标题】用 PHP 将一个 mysqli 表转换为 JSON 格式【英文标题】:One mysqli table into JSON format with PHP 【发布时间】:2018-03-06 01:57:04 【问题描述】:

我正在尝试使用特定的 mysqli 表获得所需的回报,该表具有以下结构:

id | name  | parentid
--------------------
1  | Boss    | 0
2  | Bob     | 1
3  | Chef1   | 1
4  | Chef2   | 1
5  | Lara    | 3
6  | Kim     | 4
7  | Nick    | 1
63 | Oldboss | 20 

我需要为每个父母的名字取一个新的:

[
    
    "name": "Boss",
    "attributes": 
      "data-id": "1"
    ,
    "children": [
            
        "name": "Bob",
        "attributes": 
          "data-id": "2"
        
      ,
      
        "name": "Chef1",
        "attributes": 
          "data-id": "3"
        
      ,
      
        "name": "Chef2",
        "attributes": 
          "data-id": "4"
        
      ,
      
        "name": "Nick",
        "attributes": 
          "data-id": "7"
        
      
    ]
  ,
    
    "name": "Chef1",
    "attributes": 
      "data-id": "3"
    ,
    "children": [
            
        "name": "Lara",
        "attributes": 
          "data-id": "5"
        
      
    ]
  ,
    
    "name": "Chef2",
    "attributes": 
      "data-id": "4"
    ,
    "children": [
            
        "name": "Kim",
        "attributes": 
          "data-id": "6"
        
      
    ]
  
]

这就是我需要得到的,对于每个有孩子的名字都需要在顶部,但也显示在他的父母之下。这将在将回显用于 while 格式时产生相同的结果。但我无法让数组/JSON 来构建我想要的结果。这是我目前拥有的:

$returnarray = array();

$sql = "SELECT DISTINCT
  t_names.name AS Name2,
  t_names.id AS ID2
FROM t_names
  INNER JOIN t_names t_names_1
    ON t_names.id = t_names_1.parentid
WHERE t_names.parentid <> 63
AND t_names.id <> 63";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_array($result))


$subarray = array(
        "data-id"=> $row['ID2']
    );  

$headarray = array(
    "name"=> $row2['Name2'],
    "attributes"=> $subarray,
    "children"=>$rowarray2
);

$sql2 = "SELECT DISTINCT id, name, parentid FROM t_names WHERE parentid = '$row[ID2]' ";
$result2 = mysqli_query($conn, $sql2);
while($row2 = mysqli_fetch_assoc($result2))

$subarray2 = array(
        "data-id"=> $row2['id']
    ); 

$rowarray = array(
        "name"=> $row2['Name'],
        "attributes"=> $subarray2
    );  

$rowarray2[] = $rowarray;



$returnarray[] = $headarray;



echo "<pre>";

echo json_encode($returnarray, JSON_PRETTY_PRINT);

echo "</pre>";

上面的结果确实创建了一个json格式的代码:

- Boss
Bob
Chef1
Chef2
Nick

-Chef1
Bob
Chef1
Chef2
Nick
Lara

-Chef2
Bob
Chef1
Chef2
Nick
Lara
Kim

因此它创建了组,但它继续使用以前组中的数据并在它们后面添加正确的名称。

我的数组有什么问题?

【问题讨论】:

$row[ID2] 不是将 ID2 称为常量吗?它在您的 sql 查询中。 @Xor 实际上,只有当变量本身用双引号引起来时,数组索引周围的引号才是可选的。 @jeff 但是如果用单引号括起来,它根本就不是一个变量,只是一个文字。这就提出了一个问题,如果你希望它使用一个常数,:)。无论哪种方式,我认为这是一种不好的做法,会污染代码等等。我宁愿 concat 或 sprintf 它。 @Xorifelse 如果用单引号括起来,那么变量插值将根本不起作用。不使用也没关系。 php 很灵活。我认为应该选择一种编码风格并保持一致。 @jeff Hmmz,正确。在文字字符串中,不会发生插值(而是避免使用昂贵的单词)。和一致性是的,但是用引号定义一个数组并在没有引号的情况下使用它本身就是一种不一致。看来我是正确的,只是测试了代码,它会发出使用未定义常量的通知,但假定它是一个数组键。所以这可能会破坏代码。换句话说,它可以工作,但$row['ID2'] 是应该这样做的方式。 【参考方案1】:

我只需在该一元关系上加入表一次,遍历分组在相同父索引下的行,然后折叠顶层。

function transformEmployee($user)

    $output['name'] = $user['employee'];
    $output['attributes']['data-id'] = $user['emp_id'];
    return $output;


$mysqli = new mysqli('server', 'username', 'password', 'database');

$sql = '
    SELECT bosses.id AS boss_id, bosses.name AS boss,
        employees.id AS emp_id, employees.name AS employee
    FROM names bosses
    JOIN names employees
      ON bosses.id = employees.parent_id
';

$names = $mysqli->query($sql)->fetch_all(MYSQLI_ASSOC);

foreach ($names as $name) 
    $result[$name['boss_id']]['name'] = $name['boss'];
    $result[$name['boss_id']]['attributes']['data-id'] = $name['boss_id'];
    $result[$name['boss_id']]['children'] []= transformEmployee($name);


echo json_encode(array_values($result), JSON_PRETTY_PRINT);

【讨论】:

先生,您太棒了!这给了我准确的结果,我需要一个快速的结果。

以上是关于用 PHP 将一个 mysqli 表转换为 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQLi 连接器转换为 PHP PDO

PHP MySQLi将结果集转换为CSV或JSON

将 PHP 数组转换为 SQL 语句?

mysqli将位和整数作为字符串返回

尝试将 xampp 数据库表连接到 php:错误未定义变量:mysqli_query 和致命错误

在 PHP 中将日期时间从 SQL 转换为字符串