PHP 7.2之后再也回不去?扩展运算符带来的数组合并革命(仅限高级开发者)

第一章:PHP 7.2扩展运算符的里程碑意义

PHP 7.2 的发布标志着语言在语法简洁性和开发效率上的重要进步,其中最具代表性的新特性之一便是**扩展运算符(Splat Operator)**在数组中的正式支持。此前,扩展运算符仅用于函数参数中实现可变参数列表,而 PHP 7.2 将其能力延伸至数组解构与合并操作,极大提升了数组处理的灵活性。

扩展运算符的语法形式

在 PHP 7.2 中,三个点 ... 被正式定义为扩展运算符,可用于将数组展开为独立元素。该操作可在函数调用、数组字面量以及遍历中使用。
// 数组合并示例
$parts = ['apple', 'banana'];
$fruits = ['orange', ...$parts, 'mango'];
// 结果: ['orange', 'apple', 'banana', 'mango']

// 函数参数展开
function sum($a, $b, $c) {
    return $a + $b + $c;
}
echo sum(...[1, 2, 3]); // 输出: 6

应用场景对比

以下表格展示了传统方式与使用扩展运算符在常见操作中的差异:
操作类型传统方法使用扩展运算符
合并数组array_merge($a, $b)[...$a, ...$b]
传递参数call_user_func_array('func', $args)func(...$args)
构建数组需多次 push 或合并直接展开嵌入
  • 扩展运算符提升代码可读性,使数组操作更直观
  • 减少对辅助函数如 array_merge 的依赖
  • 支持嵌套展开,适用于复杂数据结构处理
graph LR A[原始数组] --> B{应用...运算符} B --> C[展开元素] C --> D[构建新数组或调用函数]

第二章:扩展运算符的核心机制解析

2.1 扩展运算符语法结构与底层原理

扩展运算符(Spread Operator)由三个连续的点(...)构成,可用于数组、对象和函数调用中,其核心作用是将可迭代对象展开为独立元素。
基本语法形式

// 数组展开
const arr = [1, 2, 3];
console.log([...arr, 4]); // [1, 2, 3, 4]

// 对象展开
const obj = { a: 1, b: 2 };
const clone = { ...obj }; // 浅拷贝
上述代码中,... 将数组或对象的每一项逐个提取,实现数据的合并与复制。该操作基于 ES6 的迭代协议,对 Symbol.iterator 进行调用。
底层执行机制
  • 扩展运算符在解析时触发目标对象的迭代器接口;
  • 对于非可迭代对象(如普通对象),引擎采用自有属性枚举方式(即 Object.keys)进行浅层展开;
  • 最终生成一个新的数组或对象,不修改原数据。

2.2 与array_merge的性能对比分析

在处理PHP数组合并时,`+` 操作符与 `array_merge` 函数常被使用,但二者在性能和行为上存在显著差异。
行为差异
`+` 操作符保留左侧数组的键值对,仅补充右侧数组中键不存在的元素;而 `array_merge` 会重新索引数字键,并覆盖相同字符串键的值。

$a = ['a' => 1, 'b' => 2];
$b = ['b' => 3, 'c' => 4];

var_dump($a + $b);        // b=2(保留左)
var_dump(array_merge($a, $b)); // b=3(右覆盖)
上述代码展示了键冲突时的不同策略,`+` 更适合配置合并,`array_merge` 适用于顺序数据追加。
性能测试
  • 对于小数组(<100元素),两者性能接近;
  • 大数组下,`+` 操作符平均快30%,因其不重索引;
  • `array_merge` 需复制所有元素并重建索引,开销更高。

2.3 可遍历对象与数组的无缝融合

在现代JavaScript开发中,可遍历对象(如Map、Set)与数组之间的数据交互愈发频繁。通过迭代协议,两者可以实现高效融合。
扩展运算符的统一接口
const set = new Set([1, 2, 3]);
const array = [...set, 4, 5];
console.log(array); // [1, 2, 3, 4, 5]
上述代码利用扩展运算符将Set实例转换为数组,并拼接新元素。其核心在于所有可遍历对象都实现了[Symbol.iterator]方法,提供统一的遍历机制。
常见可遍历对象兼容性
对象类型可扩展运算符Array.from()
Array是是
Set是是
Map是(返回键值对数组)是

2.4 键值冲突处理策略深入探讨

在分布式键值存储系统中,键值冲突常因并发写入或网络分区而产生。为保障数据一致性,系统需采用合理的冲突解决机制。
常见冲突处理策略
  • 最后写入胜出(LWW):基于时间戳选择最新更新,实现简单但可能丢失数据;
  • 向量时钟:记录事件因果关系,支持精确冲突检测;
  • Casual Consistency:在弱一致性基础上保留部分顺序约束。
基于向量时钟的比较示例
type VectorClock map[string]int

func (vc VectorClock) Less(other VectorClock) bool {
    for node, time := range vc {
        if other[node] > time {
            return true
        }
    }
    return false
}
该代码定义了一个向量时钟结构及其偏序比较逻辑。每个节点维护自身计数器,通过比较各节点版本号判断事件先后。当无法完全排序时,系统标记为冲突状态,需上层应用介入处理。

2.5 非整数键名与字符串索引的行为特性

在动态语言中,对象或映射类型的键通常支持字符串和非整数类型。当使用非整数作为键名时,运行时会自动将其转换为字符串表示形式。
键名的隐式转换
  • 数字键会被转换为对应的字符串形式
  • 布尔值、null 和 undefined 也会被字符串化
  • 对象作为键时调用其 toString() 方法

const map = {};
map[true] = 'boolean true';
map[{}] = 'object key';
console.log(map['true']);  // 输出: 'boolean true'
console.log(map['[object Object]']);  // 输出: 'object key'
上述代码展示了布尔值 true 被转为字符串 "true",而空对象被转为 "[object Object]"。这种隐式转换可能导致意外的键覆盖。
字符串索引的访问一致性
无论使用 obj["key"] 还是 obj.key,底层均以字符串键进行查找,确保访问语义统一。

第三章:实际开发中的典型应用场景

3.1 配置数组的动态合并与覆盖

在现代配置管理系统中,配置数组的动态合并与覆盖是实现环境差异化部署的关键机制。该机制允许基础配置与环境特定配置按优先级进行智能整合。
合并策略
支持递归合并与完全覆盖两种模式。递归合并保留共用配置,仅替换差异项;完全覆盖则以新数组替代旧数组。
代码示例

func MergeConfig(base, override []interface{}) []interface{} {
    result := make([]interface{}, len(base))
    copy(result, base)
    return append(result, override...) // 覆盖逻辑可自定义
}
上述函数将 override 数组追加至 base 末尾,适用于插件式配置扩展场景。实际应用中可通过键值匹配实现精准覆盖。
  • 高优先级配置项优先生效
  • 空值字段可触发默认值回退
  • 支持多层级嵌套数组合并

3.2 函数参数可变数组的优雅传递

在现代编程实践中,处理可变数量的函数参数是常见需求。Go语言通过...操作符提供了对可变参数的原生支持,使数组或切片能被高效传递。
基本语法与用法
func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}
该函数接受任意数量的int参数。调用时可传入多个值,如sum(1, 2, 3),内部将numbers视为[]int切片。
切片展开传递
若已有切片数据,可通过...展开传递:
values := []int{1, 2, 3}
result := sum(values...) // 展开切片元素
此方式避免手动遍历,提升代码简洁性与执行效率,是处理批量数据的推荐模式。

3.3 API响应数据的灵活构造实践

在构建现代RESTful API时,响应数据的结构设计直接影响前端消费体验与系统可维护性。为实现灵活性,推荐采用DTO(Data Transfer Object)模式对原始数据进行封装。
响应结构统一化
通过定义标准响应体,确保接口一致性:
{
  "code": 200,
  "message": "success",
  "data": { /* 业务数据 */ }
}
其中,code表示状态码,message用于提示信息,data承载实际内容,便于前端统一处理。
动态字段过滤
使用结构体标签与反射机制按需输出字段:
type User struct {
    ID    uint   `json:"id"`
    Name  string `json:"name"`
    Email string `json:"-"` // 敏感字段默认隐藏
}
通过json:标签控制序列化行为,结合中间件参数实现字段级权限控制。

第四章:陷阱规避与最佳工程实践

4.1 类型安全校验与运行时异常预防

在现代编程语言中,类型安全是保障程序稳定性的核心机制之一。通过编译期的类型检查,可有效拦截非法操作,减少运行时异常的发生。
静态类型检查的优势
静态类型系统能在代码执行前发现类型不匹配问题。例如,在 Go 中定义结构体字段时,编译器会强制校验赋值类型的兼容性:

type User struct {
    ID   int64
    Name string
}

var u User = User{ID: 1, Name: "Alice"} // 正确
// var u User = User{ID: "1"} // 编译错误:cannot use "1" (type string) as type int64
该机制避免了将字符串误赋给整型字段导致的运行时崩溃。
空值与可选类型的处理
许多语言引入可选类型(如 Rust 的 Option)来消除空指针异常。通过模式匹配强制解包,确保逻辑路径完整覆盖:
  • Option::Some(value) 表示存在值
  • Option::None 表示无值,需显式处理

4.2 多维数组合并时的注意事项

在处理多维数组合并时,结构一致性是首要考虑因素。若数组维度不同或键名冲突,可能导致数据覆盖或结构错乱。
键名冲突处理
使用 array_merge_recursive 可避免相同键的值被覆盖,自动将同名键的值合并为数组:

$arr1 = ['a' => [1, 2], 'b' => [3]];
$arr2 = ['a' => [4], 'b' => [5]];
$result = array_merge_recursive($arr1, $arr2);
// 结果:['a' => [1, 2, 4], 'b' => [3, 5]]
该函数递归合并数组,适用于配置合并等场景,但需注意可能产生嵌套过深的数据。
维度对齐检查
  • 确保参与合并的数组具有相同层级结构
  • 数值索引数组应使用 array_merge 以重新索引
  • 关联数组需警惕键名覆盖问题

4.3 性能敏感场景下的使用权衡

在高并发或低延迟要求的系统中,资源使用与性能之间需精细权衡。过度优化可能导致可维护性下降,而保守设计则可能成为瓶颈。
缓存策略的选择
对于频繁读取的数据,本地缓存可显著降低响应时间,但会引入一致性挑战。分布式缓存如 Redis 提供统一视图,但增加网络开销。
异步处理模型
采用异步非阻塞 I/O 可提升吞吐量。以下为 Go 语言示例:
go func() {
    for event := range eventCh {
        process(event) // 异步处理事件
    }
}()
该模式通过协程解耦主流程,避免阻塞主线程。eventCh 为带缓冲通道,控制并发节奏,防止资源耗尽。
  • 同步调用:延迟低,但吞吐受限
  • 异步消息:吞吐高,引入额外延迟
最终选择应基于压测数据,在延迟、吞吐和复杂度之间找到平衡点。

4.4 与旧版本兼容性方案设计

在系统升级过程中,确保新版本与旧版本之间的平滑过渡至关重要。为实现双向兼容,采用接口版本控制与数据结构冗余字段相结合的策略。
接口版本路由
通过 URL 路径区分 API 版本,例如:
// 路由注册示例
router.HandleFunc("/v1/user", userServiceV1)
router.HandleFunc("/v2/user", userServiceV2)
上述代码中,/v1/user 和 /v2/user 分别指向不同版本的处理逻辑,避免调用冲突。
数据兼容性处理
使用可选字段与默认值填充机制,保障旧客户端能解析新数据格式。下表展示关键字段映射:
字段名旧版本支持新版本行为
user_id是保留并标记为 legacy
uid否新增,旧版忽略
该设计允许系统在运行时动态适配不同版本请求,降低升级风险。

第五章:迈向现代PHP数组编程范式

函数式编程风格的数组操作
现代PHP鼓励使用不可变、链式调用的函数式风格处理数组。通过 array_map、array_filter 和 array_reduce,可避免传统循环带来的副作用。

$numbers = [1, 2, 3, 4, 5];

$squaredEven = array_filter(
    array_map(fn($n) => $n ** 2, $numbers),
    fn($n) => $n % 2 === 0
);

// 输出: [4, 16]
print_r($squaredEven);
利用解构与展开提升可读性
PHP 7.4+ 支持数组解构,结合展开操作符(...)可简化参数传递和合并逻辑。
  • 解构适用于已知结构的数组,如配置项提取
  • 展开操作符可用于动态构建数组,替代 array_merge
  • 在API响应处理中尤其高效

$data = ['name' => 'Alice', 'age' => 30];
['name' => $name] = $data;

$extended = [...$data, 'role' => 'admin'];
集合类的实战应用
Laravel 的 Collection 类已成为现代PHP数组管理的事实标准。其惰性求值与链式API极大提升数据流控制能力。
方法用途示例
->when()条件化执行操作$collection->when($isAdmin, fn($c) => $c->push('admin'))
->tap()调试或副作用插入$collection->tap(function ($c) { Log::debug($c); })
流程图示意: 原始数据 → 过滤 → 映射 → 分组 → 格式化输出 ↓ ↓ 条件分支 性能优化点
【数据分析】宏基因组alpha和beta多样性分析和差异物种筛选案例 本教程为读者呈现了宏基因组α和β多样性分析的完整案例。通过实际数据和详细步骤,读者可以深入理解这两种分析方法及其在R语言中的实现过程。教程中不仅提供了清晰的代码示例,还对每一步骤进行了详细解释,使读者能够轻松跟随并掌握分析技巧。无论是初学者还是有一定基础的研究者,都能通过本教程快速上手宏基因组多样性分析,为微生物组学研究提供有力支持。 阅读详情

相关推荐

cadence virtuoso 激励信号源

vpulse,vpwl,vsin,vsource信号源介绍

努力学习的IC小白 3万+

7 PHP运算符

X!==y 绝对不等于 PHP7+ 版本新增整除运算符intdiv(),使用实例: <?php var_dump(intdiv(10, 3)); ?> 输出:int(3) <?php $x = array("a" => "red", "b" => "green"); $y = array("c" => "blue", "d" =>...

Icedeny的博客 256

基于wxWidgets框架,使用DialogBlocks建立OpenGL界面

前言 之前公司要求使用wxWidgets做GUI,基于OpenGL图形内核,开发三维可视化工具。目前初步开发工作基本已经完成,剩下都是完善了。这里记录一下最开始的框架搭建过程(当然是简化版啦)。wxWidgets结合OpenGL开发可以实现跨平台应用,再结合CMake和VS Code,整体开发工具用习惯了会感觉非常顺手。 界面编辑 首先,使用DialogBlocks新建一个工程,这里工程目录...

cyberobot的博客 2749

php之字符串变量和运算符

php字符串变量 字符串变量主要用于存储并处理文本。 php中的字符串变量 字符串变量用于包含有字符的值。在创建字符串之后,我们就可以进行操作,可直接再函数中使用字符串或者把他存储在变量中。例如: 当赋值一个文本值给一个变量时,需要将文本值加上单引号或者双引号 以下是php字符串所能进行的操作,主要使用两种方式,分别是运算符和函数。 php并置运算符 字符串只有一个运算符,就是并置运算符(.),...

fzykn06的博客 1072

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

【3D目标检测】环境搭建(OpenPCDet、MMdetection3d、Det3d)

在Conda虚拟环境中搭建MMdetection3d环境

qq_44703886的博客 4252

揭秘PHP 7.3空合并赋值:为何它成为现代PHP开发的标配语法?

解决PHP数组赋值冗余问题,PHP 7.3空合并赋值数组语法简化代码逻辑,适用于变量存在性判断与默认值设置场景。利用??=操作符实现简洁安全的赋值方式,提升开发效率与代码可读性,现代PHP开发必备技巧,值得收藏。

PixelGlow的博客 425

告别手动输入!用Access批量导入307种土壤数据到SWAT模型(附完整MDB操作流程)

本文详细介绍了如何利用Microsoft Access批量导入307种土壤数据到SWAT模型,显著提升数据录入效率。通过解析usersoil表结构、提供Access操作指南和VBA自动化脚本,帮助环境工程师避免手动输入错误,实现高效数据管理。文章还包含性能优化技巧和常见错误解决方案,是SWAT模型用户的实用指南。

weixin_28366053的博客 324

PHP数组操作革命性升级(参数展开功能全解析)

掌握PHP 7.3参数展开数组技巧,提升函数调用效率。详解其在可变参数传递中的应用,支持批量数据处理与动态函数调用,代码更简洁高效。适用多种数组操作场景,显著增强可读性与灵活性,值得收藏

ProceGlow的博客 398

Bentley ORD(openroads designer) 二次开发(BIM)第七节 在ORD SDK中调用MicroStation SDK

从课程刚开始的时候我们就通过学习,了解了ORD的开发是基于MicroStation的,ORD SDK的接口发布的时候也对MicroStation SDK也做了一次发布。这一章将以我们对ORD SDK知识的了解为基础,使用ORD SDK的接口读取道路几何信息、计算桩号,然后再使用MicroStation SDK 读取地形数据和计算投影点的位置,并创建一组方柱形状的Soild。计算方柱底部坐标要经过两大步骤,通过路线的桩号及偏移距离去定位方柱的平面位置,通过方柱的平面位置计算数字地面模型上的投影点的坐标。

chen286990651的博客 880

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3515

PHP 运算符

PHP运算符 PHP 算术运算符 PHP7+ 版本新增整除运算符intdiv(),该函数返回值为第一个参数除于第二个参数的值并取整(向下取整)。 PHP 赋值运算符 在 PHP 中,基本的赋值运算符是 "="。它意味着左操作数被设置为右侧表达式的值。 PHP 递增/递减运算符 PHP 比较运算符 PHP 逻辑运算符 PHP 数组运算符 三元运算符 另一个条件运算符是"?:"(或三元)运算符 。 语法格式 (expr1) ? (expr2) : (expr..

weixin_43909650的博客 150

反光柱定位算法中的移动机器人姿态计算原理-经典三边定位最小二乘法计算定位-直接法计算定位

(二)计算姿态方式是我们已经通过最小二乘得到了小车在地图中的位置或者是雷达在地图中的位置,又因为我们知道雷达与小车的安装坐标,所以可以求解出一其中一个坐标的知量,通过小车在地图中坐标与雷达在地图中坐标可以得到一条向量,通过计算向量在地图中的角度就能得到姿态了。与最小二乘三边测量法相比,新算法在动态调整、优化过程和鲁棒性方面优势明显,尤其适合动态环境下的机器人定位,而最小二乘三边测量法在动态复杂环境中精度相对较低。(一)与(二)的区别主要是在计算姿态上的算法不同。经典三边定位最小二乘法 (法一)

苏凯的博客 1140

c#与php合并开发,PHP中的C#的空合并运算符(??)

PHP 7添加了null coalesce operator:// Fetches the value of $_GET['user'] and returns 'nobody'// if it does not exist.$username = $_GET['user'] ?? 'nobody';// This is equivalent to:$username = isset($_GET[...

weixin_39649660的博客 168

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【PHP入门】五、运算符

对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序。运算符优先级中,or 和 ||,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。我们通过括号的配对来明确标明运算顺序,而非靠运算符优先级和结合性来决定,通常能够增加代码的可读性。也就是说,$x = 5 的值是 5。当使用||和&&进行复合时,返回值为布尔值,整形被视为true;在 PHP 中,基本的赋值运算符是。

weixin_45720193的博客 382

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从PHP 7到PHP 8.3的飞跃:只读属性带来的5大架构优势,你掌握了吗?

掌握PHP 8.3新特性:只读属性与类型增强,提升代码安全与可维护性。适用于实体类、配置对象等场景,通过声明只读属性防止意外修改,结合联合类型优化类型提示。五大架构优势助力项目稳定性升级,值得收藏。

ByteVein的博客 1029

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

php 判断update返回为0_PHP程序员从入门到佛系第十弹:PHP 运算符

PHP 运算符本章节我们将讨论 PHP 中不同运算符的应用。在 PHP 中,赋值运算符 = 用于给变量赋值。在 PHP 中,算术运算符 + 用于把值加在一起。PHP 算术运算符以下实例演示了使用不同算术运算符得到的不同结果:$x=10; $y=6;echo ($x + $y); // 输出16echo ''; // 换行echo ($x - $y); // 输出4echo ''; // 换行ech...

weixin_28812983的博客 108

c++自底向上算符优先分析_PHP程序员从入门到佛系第十弹:PHP 运算符

PHP 运算符本章节我们将讨论 PHP 中不同运算符的应用。在 PHP 中,赋值运算符 = 用于给变量赋值。在 PHP 中,算术运算符 + 用于把值加在一起。PHP 算术运算符以下实例演示了使用不同算术运算符得到的不同结果:$x=10; $y=6;echo ($x + $y); // 输出16echo ''; // 换行echo ($x - $y); // 输出4echo ''; // 换行ech...

weixin_39777464的博客 91

菜鸟的最后一篇php教程

为什么要起这个名字?其实其中回答了何种人适合看这篇文章——有其他语言基础刚入web后端的初学者。本文主要是对菜鸟教程中的PHP部分做了精简,有基础的能节省不少时间。 PHP变量的作用域 local global:在函数内调用函数外的全局变量时会用到,存储在一个名为 $GLOBALS[index] 的数组中。 static:希望某个局部变量不要被删除时用到,该变量仍然是函数的局部变量 parameter echo 和 print php原生只有这两种输出模式,它...

画家高的博客 905

从PHP 5到PHP 8:二十年演进史与关键升级指南

PHP历经20年发展,从PHP5到PHP8完成了全面进化。PHP5奠定面向对象基础,PHP7实现性能飞跃(速度提升2-3倍),PHP8引入JIT编译器和现代类型系统。核心改进包括:Zend引擎优化使内存占用减少30%;类型系统从弱类型到支持联合类型、属性注解;语法糖如nullsafe运算符、match表达式提升开发效率。版本迁移需注意废弃特性处理、严格类型兼容和性能调优(OPcache/JIT配置)。现代PHP兼具高性能和严谨性,在Web开发领域保持领先地位。

又见江南雨的博客 1230

预计2020年php,2020 年的 PHP 回顾与展望

对于一般的 Web 开发人员和程序员来说,PHP 的声誉并不是很好,这已经是众所周知。尽管 PHP 仍然是构建 Web 应用程序最常用的语言之一,但多年来 PHP 已经设法给自己赢得了代码库混乱、开发人员缺乏经验、代码不安全、核心库不一致等等的名声。虽然许多反对 PHP 的论点今天仍然有效,但也有好的一面:您可以用 PHP 编写干净、可维护、快速和可靠的应用程序。在这篇文章中,我想让你看到 PHP...

weixin_28933797的博客 170

php所有知识点,PHP那些琐碎的知识点(整理)

PHP不会检查单引号 '' 字符串中变量内插或(几乎)任何转义序列,所以采用单引号这种方式来定义字符串相当简单快捷。但是,双引号 "" 则不然,php会检查字符串中的变量或者转义序列,并输出变量和转义序列的值。$a = "123";print '$a\t';print '$a';输出:$a\t$a如果是双引号 "" :$a = "123";print "$a\t";print "$a";输出:注意...

weixin_33787865的博客 122

php总结与展望_2020 年的 PHP 回顾与展望

对于一般的 Web 开发人员和程序员来说,PHP 的声誉并不是很好,这已经是众所周知。尽管 PHP 仍然是构建 Web 应用程序最常用的语言之一,但多年来 PHP 已经设法给自己赢得了代码库混乱、开发人员缺乏经验、代码不安全、核心库不一致等等的名声。虽然许多反对 PHP 的论点今天仍然有效,但也有好的一面:您可以用 PHP 编写干净、可维护、快速和可靠的应用程序。在这篇文章中,我想让你看到 PHP...

weixin_36058685的博客 363

来都来了,8个JavaScript技巧奉上

作为最流行的语言之一,其语法灵活且每年都在不断吸纳新特性,即使是一个从业多年的老手, 偶尔也会有一些被低估的功能和技巧,本文将分享这些技巧,一同讨论探究。

Sebdhsk的博客 795

PHP性能优化实战:20个提升代码效率的核心技巧

PHP作为广泛使用的服务器端脚本语言,其性能优化直接影响Web应用响应速度与资源消耗。从底层原理看,PHP解释器执行字节码时,字符串处理、循环结构和数据库操作等常见场景存在显著性能差异。通过采用单引号字符串、预处理语句和OPcache等技术手段,可提升30%-400%的执行效率,特别适用于高并发电商、社交平台等场景。本文基于str_replace比preg_replace快4倍、switch优于if-else等热词验证的优化方案,结合数据库UNBUFFERED查询等实战技巧,系统讲解如何构建高性能PHP应用

weixin_34277853的博客 368

PHP条件逻辑设计方法论:从语法到业务规则的可靠实现

条件语句是编程中最基础也最易被低估的核心能力,它本质是将现实世界中的业务规则转化为可执行、可验证、可维护的代码逻辑。其核心不仅在于if/else或match等语法形式,更在于类型安全(如===与==的严格区分)、边界处理(null/0/''的精确判别)、执行顺序(高频分支前置)和结构化表达(避免嵌套地狱)。在PHP工程实践中,松散类型、短路求值、隐式转换等语言特性既带来灵活性,也埋下大量线上Bug隐患——90%的权限越权、支付异常、数据错乱均源于条件判断不严谨。本文聚焦PHP条件逻辑的系统性设计,涵盖iss

clt3617的博客 596
上一篇: 为什么你的array_flip导致数据丢失?这4种情况你必须警惕
下一篇: 【R Shiny动作按钮实战指南】:掌握actionButton触发机制的5大核心技巧
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值