首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的嵌套JSON问题

PHP中的嵌套JSON问题
EN

Stack Overflow用户
提问于 2019-02-14 20:11:49
回答 2查看 206关注 0票数 2

我即将从一个MySQL查询中获得这个JSON,但我遇到了一些困难。

代码语言:javascript
复制
$results = [];

foreach ($getbill as $row) {
    $category = $district;
    $building = $row['building'];

    if (!isset($results[$category])) 
    {$results[$building] = ['category' => $building, 'values' => []];    }
        $results[$category] = ['category' => $building, 'values' => []];    
            $results[$row['building']]['students'][] = ['lastname' => $row['slast'], 'firstname' => $row['sfirst'], 'ens' => $row['selected'], 'part' => $row['instname'], 'division' => $row['sdiv'], 'festival' => $row['sfest']];
            }

echo json_encode(array_values($results));

上述代码出口:

代码语言:javascript
复制
[{"category":"Belmont Elementary School","values":[],"students":[{"lastname":"jones","firstname":"melissa","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"smith","firstname":"melissa","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"b","firstname":"b","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"b","firstname":"b","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"chocolate","firstname":"Charlie","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"Shmow","firstname":"Joe","ens":"C","part":"Childrens Voice","division":"1","festival":"w"},{"lastname":"abrams","firstname":"Alysond","ens":"C","part":"Childrens Voice","division":"1","festival":"w"}]},{"category":"Parliament Place","values":[]},{"students":[{"lastname":"Jones","firstname":"Joe","ens":"B","part":"Trombone","division":"1","festival":"w"},{"lastname":"Smith","firstname":"Ally","ens":"B","part":"Alto Sax","division":"1","festival":"w"}]}]

它是按学校分组的,但是,学校必须在开始的时候,就在学生信息之前列出。成品需要如下,但我不知道.

代码语言:javascript
复制
{"length":8,"schools":[{"name":"Test High School","students":[{"lastname":"Smith","firstname":"Allison","ens":"Band","part":"Bb Clarinet","division":"III","festival":"West"},{"lastname":"Jones","firstname":"Derek","ens":"Band","part":"Tuba/Sousaphone","division":"III","festival":"West"},{"lastname":"Johnson","firstname":"Matthew","ens":"Band","part":"Timpani","division":"III","festival":"West"},{"lastname":"Hughley","firstname":"Elizabeth","ens":"Band","part":"French Horn","division":"II","festival":"West"}]},{"name":"Test Elementary School","students":[{"lastname":"Jones","firstname":"Emmett","ens":"Band","part":"Bb Clarinet","division":"I","festival":"West"},{"lastname":"Aaren","firstname":"Owen","ens":"Band","part":"Tuba/Sousaphone","division":"I","festival":"West"},{"lastname":"Johns","firstname":"Sonia","ens":"Band","part":"French Horn","division":"I","festival":"West"},{"lastname":"Williams","firstname":"Nathaniel","ens":"Band","part":"Bb Clarinet","division":"I","festival":"West"}]}],"bill":120}

我假设我可以使用一个PHP变量来获得“长度”和"Bill“部分的正确性,方法是计算查询的记录并乘以15,但是。如何在PHP中插入所有正确的JSON创建代码?

更新:以下原始数据

更新2:我想明白了。正是来自“雷蒙德”的最初评论让我走上了正确的道路。谢谢。我不得不删除我的查询的一行,我不得不手动“回显”开始和结束(长度和成本)。起作用了!谢谢你们的帮助。

代码语言:javascript
复制
foreach ($getbill as $row) {
    if (!isset($results[$building])) {
        $results[$building] = ['name' => $row['building']];  
        }
        $results[$row['building']]['students'][] = ['lastname' => $row['slast'], 'firstname' => $row['sfirst'], 'ens' => $ens, 'part' => $row['instname'], 'division' => $age, 'festival' => $loc];
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-14 20:19:00

这个代码示例对您有帮助吗?

PHP对象将被转换为JSON对象,这是{}部件。

PHP数组将被转换为JSON,这与[]部件无关。

PHP代码

代码语言:javascript
复制
<?php

$StdClass = new StdClass();
$StdClass->length = 10;
$StdClass->schools = array_values(array(1, 2));

var_dump(json_encode($StdClass));

?>

结果

代码语言:javascript
复制
string(29) "{"length":10,"schools":[1,2]}"

编辑是因为取消评论:

谢谢你的快速答复,但遗憾的是,我很难弄明白这一点。此外,还有所有这些‘字符计数’,我不能使用。

是的,对于学校和学生来说,获得[{..}] JSON格式要复杂得多。

我建议您编写自定义类,并使用JsonSerializable将自定义对象转换为JSON

PHP7代码

代码语言:javascript
复制
<?php

class school implements JsonSerializable {
  private $name = null;
  private $students = array();

  private function __construct() {

  }

  public function __destruct() {
      $this->name = null;
      $this->students = null;
  }  

  // Use a static object because it will enable method chaining
  public static function getInstance() {
      return new school();
  }

  public function setName(string $name) : school { 
      $this->name = $name;
      return $this; // needed to chain
  }

  public function setStudent(Student $student) : school { 
      $this->students[] = $student;
      return $this; // needed to chain
  }  

  public function getName() : ?string {
      return $this->name;
  }

  public function getStudents() : ?array {
      return $this->students;
  }  

  public function __get($name) : mixed {
      return $this->name;
  }

  public function jsonSerialize() {
    return array(
        "name" => $this->name
      , "students" => $this->students
    );
  }  
}

class student implements JsonSerializable {
  private $lastname = null; 
  private $firstname = null;

  private function __construct() {

  }

  public function __destruct() {
      $this->lastname = null;
      $this->firstname = null;
  }

  // Use a static object because it will enable method chaining
  public static function getInstance() {
      return new student();
  }  

  public function setLastName(string $lastname) : student { 
      $this->lastname = $lastname;
      return $this; // needed to chain
  }  

  public function setFirstName(string $firstname) : student { 
      $this->firstname = $firstname;
      return $this; // needed to chain
  } 

  public function getFirstName() : ?string {
      return $this->firstname;
  }

  public function getLastName() : ?string {
      return $this->lastname;
  }  

  public function jsonSerialize() {
    return array(
        "lastname" => $this->lastname
      , "firstname" => $this->firstname
    );  
  }
}

$json = new stdClass();
$json->length = 10;


$json->schools = array(
    school::getInstance()
          ->setName('Test High School')
          ->setStudent(
              student::getInstance()
                     ->setFirstname('Smith') 
                     ->setLastname('Allison')
          )
          ->setStudent(
              student::getInstance()
                     ->setFirstname('Jones') 
                     ->setLastname('Derek')
          )          
    , 
    school::getInstance()
          ->setName('Test Elementary School')    
          ->setStudent(
              student::getInstance()
                     ->setFirstname('Jones') 
                     ->setLastname('Emmett')  
         ) 
);

var_dump(json_encode($json));

?>

p.s使代码在较低的PHP版本上工作,删除PHP的返回类型声明

的结果是这种JSON格式

代码语言:javascript
复制
{
    "length": 10,
    "schools": [{
        "name": "Test High School",
        "students": [{
            "lastname": "Allison",
            "firstname": "Smith"
        }, {
            "lastname": "Derek",
            "firstname": "Jones"
        }]
    }, {
        "name": "Test Elementary School",
        "students": [{
            "lastname": "Emmett",
            "firstname": "Jones"
        }]
    }]
}
票数 1
EN

Stack Overflow用户

发布于 2019-02-14 20:36:05

为了让你的生活更轻松,我建议你做一些事情

代码语言:javascript
复制
$students_array = []; 
array_push($students_array, ["key"=>"data"]);

要获得与您想要的类似的数组,请查看下面的结构。依此类推,对于嵌套的那些,我认为这会有帮助的,不要犹豫地问!

代码语言:javascript
复制
json_encode(
                [
                    "length"=>/*sizeof($some_array)*/ 2,
                    "schools" =>
                    [
                        "name" => 'test highscool',
                        "students" => [
                            [
                                "lastname" => "Smith",
                                "firstname" => "Allison",
                                "ens" => "Band",
                                "part" => "Bb Clarinet",
                                "division" => "III",
                                "festival" => "West"],
                            [
                                "lastname" => "Jones",
                                "firstname" => "Derek",
                                "ens" => "Band",
                                "part" => "Tuba/Sousaphone",
                                "division" => "III",
                                "festival" => "West"
                            ]
                        ]
                    ],
                    [
                        "name" => 'test highscool_2',
                        "students" => [
                            [
                                "lastname" => "Smith 2",
                                "firstname" => "Allison 2",
                                "ens" => "Band 2",
                                "part" => "Bb Clarinet 2",
                                "division" => "III 2",
                                "festival" => "West 2"]
                        ]
                    ]
                ]
            );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54698349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档