首页 » 网站建设 » php中可以引用php代码吗技巧_PHP的引用你知道若干

php中可以引用php代码吗技巧_PHP的引用你知道若干

访客 2024-11-21 0

扫一扫用手机浏览

文章目录 [+]

$list = [ ['orderid' => '123', 'total_fee' => 10, 'name' => 'zhangsan'], ['orderid' => '456', 'total_fee' => 17, 'name' => 'lisi'], ['orderid' => '789', 'total_fee' => 14, 'name' => 'wangwu'],];foreach ($orders as &$item) { // 对订单做了些什么处理}// 有了一些其它操作$result = [];// 须要返回的结果foreach ($orders as $item) {// 重新映射名字 $result[] = [ 'order_id' => $item['orderid'], 'amount' => $item['total_fee'], ];}

上面的程序会输出如下结果:

var_dump($result);array(3) { [0]=> array(2) { [\"大众order_id\"大众]=> string(3) \公众123\"大众 [\"大众total_fee\"大众]=> int(10) } [1]=> array(2) { [\"大众order_id\公众]=> string(3) \公众456\"大众 [\公众total_fee\公众]=> int(17) } [2]=> array(2) { [\公众order_id\公众]=> string(3) \"大众456\公众 [\"大众total_fee\"大众]=> int(17) }}

这便是常常碰着的一种所谓的诡异问题,先用引用循环处理数据,后面又用了与引用相同的临时变量连续处理数据。
这里便是:$item
很多同学说预防这种问题,就要少用引用。
这种态度太悲观了,引用在很多地方带来了代码书写的简洁,并且针对大数组利用引用能够节省大量的内存。

php中可以引用php代码吗技巧_PHP的引用你知道若干

诡异问题解析

现在我们来剖析下上面问题涌现的缘故原由。
先来看引用的定义

php中可以引用php代码吗技巧_PHP的引用你知道若干
(图片来自网络侵删)
引用意味着用不同的名字访问同一个变量内容。

那么在这部分代码中

foreach ($orders as &$item) { // 对订单做了些什么处理}

$item 末了跟 $orders[2] 指向了同一个变量内容。
并且在 foreach 循环完后,$item 并没有被销毁,因此在后续如果同名的话,会连续生效。
图示如下:

那么再接下来的的另一个循环中。

foreach ($orders as $item) {// 重新映射名字 $result[] = [ 'order_id' => $item['orderid'], 'amount' => $item['total_fee'], ];}

每当 $orders 把变量赋值给 $item 的时候,都同时改变了 $orders[2] 的值。
因此才会涌现上面诡异的情形。
我来逐步给大家演示下:

第一次循环 $orders[0]$item 指向 orderid=123 的订单,由于 $item$orders[2] 的引用,此时导致 $orders[2]也指向了 orderid=123 的订单;

第二次循环 $orders[1], $item 指向 orderid=456 的订单,因此 $orders[2] 也指向了 orderid=456

第三次循环 $orders[2]的时候,明显其值已经变成了 orderid=456 的订单。

通过上面的剖析,我相信大家对引用所谓的诡异有了理解。
那么又该如何避免这种情形涌现呢?实在很大略,每次利用完引用后,记得 unset 调引用。
在后面便可毫无顾忌的连续利用了。
详细到本例子便是:

foreach ($orders as &$item) { // 对订单做了些什么处理}unset($item);// 有了一些其它操作foreach ($orders as $item) {// 重新映射名字}引用的妙用

前面我说过,引用可以写出简洁的代码。
无限级分类的利用便是一个利用场景。
比如说我们有个分类的数据:

$catList = [ '1' => ['id' => 1, 'name' => '颜色', 'parent_id' => 0], '2' => ['id' => 2, 'name' => '规格', 'parent_id' => 0], '3' => ['id' => 3, 'name' => '白色', 'parent_id' => 1], '4' => ['id' => 4, 'name' => '玄色', 'parent_id' => 1], '5' => ['id' => 5, 'name' => '大', 'parent_id' => 2], '6' => ['id' => 6, 'name' => '小', 'parent_id' => 2], '7' => ['id' => 7, 'name' => '黄色', 'parent_id' => 1],];

如果我想得到下面这种形式

$result = [ ['id' => 1, 'name' => '颜色', 'children' => [ ['id' => 3, 'name' => '白色'], ['id' => 4, 'name' => '玄色'], ['id' => 7, 'name' => '黄色'] ]], ['id' => 2, 'name' => '规格', 'children' => [ ['id' => 5, 'name' => '大'], ['id' => 6, 'name' => '小'] ]]];

如果利用引用,可以非常大略的得出结果。

$treeData = [];// 保存结果foreach ($catList as $item) { if (isset($catList[$item['parent_id']]) && ! empty($catList[$item['parent_id']])) {// 肯定是子分类 $catList[$item['parent_id']]['children'][] = &$catList[$item['id']]; } else {// 肯定是一级分类 $treeData[] = &$catList[$item['id']]; }}

大家可以试试不用引用的办法,把无限级实现出来试试,比较下代码。

标签:

相关文章

介绍皮肤设置,如何打造理想肌肤状态

随着科技的发展和人们对美的追求,皮肤设置已成为美容护肤的重要一环。如何根据皮肤类型、肤质、年龄等因素进行合理设置,已成为众多爱美人...

网站建设 2025-01-03 阅读1 评论0

介绍盖章制作,传承文化,彰显权威

自古以来,盖章在我国文化中具有重要的地位。从古代的官印、私印到现代的公章、合同章,盖章已成为一种独特的文化符号,承载着丰富的历史内...

网站建设 2025-01-03 阅读1 评论0

介绍监控破坏,技术手段与法律风险并存

随着科技的飞速发展,监控设备已遍布大街小巷,成为维护社会治安的重要手段。一些不法分子为了逃避法律制裁,开始研究如何破坏监控设备。本...

网站建设 2025-01-03 阅读1 评论0

介绍登录不上之谜,技术故障还是人为疏忽

随着互联网的普及,登录已成为人们日常生活中不可或缺的一部分。在享受便捷的登录不上这一问题也困扰着许多用户。本文将深入剖析登录不上之...

网站建设 2025-01-03 阅读1 评论0

介绍电脑键盘调出方法,让操作更高效

随着科技的发展,电脑已经成为了我们日常生活中不可或缺的工具。而电脑键盘,作为电脑输入设备,更是我们与电脑进行交流的桥梁。你是否知道...

网站建设 2025-01-03 阅读1 评论0

介绍磁力链,高效便捷的文件下载利器

在互联网高速发展的今天,文件下载已成为日常生活中不可或缺的一部分。而磁力链作为一种新型的文件下载方式,凭借其高效、便捷的特点,受到...

网站建设 2025-01-03 阅读1 评论0