php匿名类与索引重建

2024-06-12 15:38
文章标签 php 匿名 索引 重建

本文主要是介绍php匿名类与索引重建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要介绍匿名类与索引重建在json 编码方面的一些小技巧

问题

将下面源数据结构 json 转为目标 json
json 数据

{"code": 200,"message": "操作成功","data": [{"id": 1,"goods_id": 1,"property_name_id": 1,"property_value_id": 1,"property_name": {"title": "份量","is_sale": true},"property_value": {"id": 1,"value": "小份","image": ""}},{"id": 2,"goods_id": 1,"property_name_id": 1,"property_value_id": 2,"property_name": {"title": "份量","is_sale": true},"property_value": {"id": 2,"value": "中份","image": ""}},{"id": 3,"goods_id": 1,"property_name_id": 2,"property_value_id": 4,"property_name": {"title": "温度","is_sale": true},"property_value": {"id": 4,"value": "常温","image": ""}},{"id": 4,"goods_id": 1,"property_name_id": 2,"property_value_id": 5,"property_name": {"title": "温度","is_sale": true},"property_value": {"id": 5,"value": "加冰","image": ""}}]
}

目标 json 结构

{"code": 200,"message": "操作成功","data": [{"property_id": 1,"property_name": "份量","is_sale": true,"items": [{"id": 1,"value": "小份","image": ""},{"id": 2,"value": "中份","image": ""}]},{"property_id": 2,"property_name": "温度","is_sale": true,"items": [{"id": 4,"value": "常温","image": ""},{"id": 5,"value": "加冰","image": ""}]}]
}

思路

  1. 将源json字符串直接解码为php对象obj
  2. 分析 获知主结构层级未变,但数据data内结构关系发生变更
  3. 重建data子项,该子项下的目标属性items下内容可从源中复用
  4. 将重建索引的data数组子项替代源data指向
  5. 对obj对象进行json编码

实现

更改引用类型数组的指向,以及用匿名类重建了data子项的一级实例对象元素。
另外,需要注意的是php关联数组,尤其是非0始的连续数字键关联数组数据,编码为json数组,需要重建索引。

 $obj = json_decode($json_str);$data = [];foreach($obj->data as $v){$nid=$v->property_name_id;if(!array_key_exists($nid,$data)){$o = new Class{};$o->property_id = $v->property_name_id;$o->property_name = $v->property_name->title;$o->is_sale= $v->property_name->is_sale ;$data[$nid]=$o;}$data[$nid]->items[]=$v->property_value;}$obj->data = array_values($data);echo json_encode($obj);

索引重建

作为弱类型语言php,在正常情况下是很踏实的扮演了这个角色,但在编码json时,如果你不通过var_dump打印一下它的原始类型,可能会发生一些你意料不到的情况。而即便是同一php类型,在不同的情况下它的json编码字符串也会不同。以php数组为例

$arr = ['a','b',3,false];
echo json_encode($arr),"\n";
$arr=['a','2'=>'b',3,false];
echo json_encode($arr),"\n";
$arr=['1'=>'a','2'=>'b'];
echo json_encode($arr),"\n";
$arr=['0'=>'a','1'=>'b'];
echo json_encode($arr),"\n";

猜猜输出的会都是json数组吗?,实际json效果如下

["a","b",3,false]
{"0":"a","2":"b","3":3,"4":false}
{"1":"a","2":"b"}
["a","b"]

类型系统

首先明确php数组不是json数组,二者是两套不同的类型系统。用过orm的同学知道,数据库语言类型(通常是sql)与你用的php数据类型有映射关系。这种映射大多数常用类型是可以找到另一种语言相同的类型(比如整型),但也有一些是找不到的。比如php中的字符串为键的关联数组,json中是不存在也不允许这样的数组。但在json中可以用键值对简单对象的形式来表示这种关联数组。

那你可能会问,第3个php数组为什么所有的键和第4个数组都是连续的数字序列,但第4个php数组进行json编码后是json数组,而第3个则是json对象??? 其实,聪明如你,可能猜到了,它的连续不是从0开始。

终点

好了,说了那么多,只是为了告知数字字符串的php关联数组索引重建再进行json编码会得到json数组。
一个有用的php原生就地重建函数 array_values($allocation_arr),还有同行函数,去手册找找看…

至于实现中解码为php对象,主在于持有实例的引用,可调动引用所指向的数据,不必劳神解码为数组后进行多轮遍历,复制值,最大程度写尽可能少的有用代码。

这篇关于php匿名类与索引重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054633

相关文章

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

mysql索引三(全文索引)

前面分别介绍了mysql索引一(普通索引)、mysql索引二(唯一索引)。 本文学习mysql全文索引。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(

mysql索引二(唯一索引)

前文中介绍了MySQL中普通索引用法,和没有索引的区别。mysql索引一(普通索引) 下面学习一下唯一索引。 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE,把它定义为一个唯一索引。 添加数据库唯一索引的几种

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

MySQL数据库(四):视图和索引

在数据库管理中,视图和索引是两种关键工具,它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象,帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作,显著提升数据库性能。理解和合理运用这两者,对数据库系统的高效运行至关重要。 目录 一、视图概念(面试) 二、视图的作用(面试) 三、视图的创建和使用 3.1

PHP的基本语法有哪些?

PHP的基本语法包括以下几个方面: PHP标记:PHP脚本以<?php开始,以?>结束。这是PHP文件的默认文件扩展名是.php。 变量和常量:变量以$符号开头,其后是变量的名称。常量使用define()函数定义,例如define("常量名", 常量值);。 数据类型:PHP支持多种数据类型,如整型、浮点型、字符串型等。 注释:PHP支持单行注释(用//表示)和多行注释(用/* */表示

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中,索引是一种关键的性能优化工具,通过它可以加快数据检索速度。在本文中,我们将深入探讨如何详细查询指定表的索引信息,以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结构,用于加快数据库表中数据的检索速度。它类似于书籍的目录,可以帮助数据库引擎快速定位数据行,特别是在大型数据集合下,其作用尤为显著。 查询指定表的索引信息 在Orac

C++ 重建二叉树(递归方法)

/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/#include <vector>class Solution {public:/*** 代码

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会