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之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

MySQL索引失效问题及解决方案

《MySQL索引失效问题及解决方案》:本文主要介绍MySQL索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql索引失效一、概要二、常见的导致MpythonySQL索引失效的原因三、如何诊断MySQL索引失效四、如何解决MySQL索引失

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多