PHP中嵌套JSON的问题
我正接近从MySQL查询中获得JSON,但我遇到了一些困难PHP中嵌套JSON的问题,php,mysql,json,Php,Mysql,Json,我正接近从MySQL查询中获得JSON,但我遇到了一些困难 $results = []; foreach ($getbill as $row) { $category = $district; $building = $row['building']; if (!isset($results[$category])) {$results[$building] = ['category' => $building, 'values' => []];
$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));
上述代码导出:
[{"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"}]}]
它是按学校分组的,但是,学校必须在开始时列出,就在学生信息之前。成品需要如下,但我不知所措
{"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变量通过计算查询记录并乘以15来获得正确的“长度”和“账单”部分,但是。。如何在PHP中压缩所有正确的JSON创建代码
更新:原始数据如下
更新2:我明白了。是@Raymond最初的评论让我走上了正确的方向。非常感谢。我必须去掉查询中的一行,并且必须手动“回显”开始和结束(长度和成本)。它起作用了!谢谢大家的帮助
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];
}
这个代码示例对您有帮助吗 PHP对象将转换为JSON对象,JSON对象是
{}
部分PHP数组将被转换为JSON数组,该数组与
[]
部分无关
PHP代码
<?php
$StdClass = new StdClass();
$StdClass->length = 10;
$StdClass->schools = array_values(array(1, 2));
var_dump(json_encode($StdClass));
?>
<?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));
?>
由于关闭评论而编辑:
谢谢你的快速回复,但遗憾的是,我遇到了一个真正的难题 是时候弄清楚了。此外,还有所有这些“性格” 我无法使用的计数 是的,为学校和学生获取
[{..}]
JSON格式更为棘手我建议您编写自定义类并使用它将自定义对象转换为JSON
PHP7代码
<?php
$StdClass = new StdClass();
$StdClass->length = 10;
$StdClass->schools = array_values(array(1, 2));
var_dump(json_encode($StdClass));
?>
<?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));
?>
为了让你的生活更轻松,我建议你做一些
$students_array = [];
array_push($students_array, ["key"=>"data"]);
要获得与您想要的类似的数组,请查看下面的结构。
等等,对于嵌套的,我想这会有所帮助,请不要犹豫
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"]
]
]
]
);
谢谢你的快速回复,但遗憾的是,我很难弄清楚这一点。还有,我无法使用所有这些“字符计数”。@PatrickNY没问题,我会尝试制作一个更好的示例,给我一些时间。不幸的是,我无法让它在mysql表中循环并填充json。json必须非常具体,我正在尝试对其进行反向工程,但遇到了困难。上面是所需的确切代码示例。此外,在某些情况下,需要列出10多栋建筑——每栋都有许多学生。无法理解。“无法理解。”我注意到你接受了解决的答案,我想你已经理解了我的代码是如何完成他的工作的?查看原始数据可能会有帮助谢谢,但你的代码似乎适合静态数据列表。我的必须来自一个MySQL函数,我不知道在代码示例中把变量放在哪里才能使其正常工作。谢谢你的时间和帮助。