Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
深入理解PHP数组洗牌与键名保留策略_创想鸟

深入理解PHP数组洗牌与键名保留策略

深入理解PHP数组洗牌与键名保留策略

在php中,shuffle()函数用于随机打乱数组元素,但它会默认重置数组的键名为数字索引,导致原始的关联键名丢失。本教程将详细解析shuffle()函数的这一行为,并提供一个自定义的shuffle_assoc()函数,通过分离键名和值、独立打乱键名再重构数组的方式,实现关联数组在随机化过程中键名的有效保留,确保数据完整性。

PHP shuffle() 函数的行为解析

当我们需要随机化一个数组时,PHP的内置函数shuffle()是一个常用的选择。然而,对于关联数组(即使用字符串作为键名的数组),shuffle()函数有一个重要的特性需要注意:它会重新分配数组元素的键名,将其转换为从0开始的数字索引。这意味着,如果你的数组依赖于其原始的关联键名进行数据标识或后续操作,使用shuffle()将导致这些键名丢失。

让我们通过一个示例来演示这个问题:

 "species/Amanita_aprica.html",    "Amanita augusta"         => "species/Amanita_augusta.html",    "Amanita calyptratoides"  => "species/Amanita_calyptratoides.html",    "Amanita calyptroderma"   => "species/Amanita_calyptroderma.html",    "Amanita constricta"      => "species/Amanita_constricta.html",    "Amanita gemmata"         => "species/Amanita_gemmata.html",    "Amanita magniverrucata"  => "species/Amanita_magniverrucata.html",    "Amanita muscaria"        => "species/Amanita_muscaria.html",    "Amanita novinupta"       => "species/Amanita_novinupta.html",    "Amanita ocreata"         => "species/Amanita_ocreata.html",    "Amanita pachycolea"      => "species/Amanita_pachycolea.html",    "Amanita pantherina"      => "species/Amanita_pantherina.html",    "Amanita phalloides"      => "species/Amanita_phalloides.html",    "Amanita porphyria"       => "species/Amanita_porphyria.html",    "Amanita protecta"        => "species/Amanita_protecta.html",    "Amanita pruittii"        => "species/Amanita_pruittii.html",    "Amanita silvicola"       => "species/Amanita_silvicola.html",    "Amanita smithiana"       => "species/Amanita_smithiana.html",    "Amanita vaginata"        => "species/Amanita_vaginata.html",    "Amanita velosa"          => "species/Amanita_velosa.html",    "Amanita vernicoccora"    => "species/Amanita_vernicoccora.html");// 原始意图:随机打乱并截取前5个元素,然后获取第一个元素的键名shuffle($speciesarray); // 第一次打乱$speciesarray = array_slice($speciesarray, 0, 5); // 截取前5个reset($speciesarray);$choice = key($speciesarray); // 获取第一个元素的键名// 调试输出print_r($speciesarray);echo("
");print_r($choice);?>

预期输出:

Array ( [Amanita silvicola] => species/Amanita_silvicola.html [Amanita gemmata] => species/Amanita_gemmata.html ... )Amanita silvicola

实际输出:

立即学习“PHP免费学习笔记(深入)”;

Array ( [0] => species/Amanita_silvicola.html [1] => species/Amanita_gemmata.html ... )0

从实际输出可以看出,经过shuffle()处理后,数组的键名从原始的字符串变为了数字0, 1, 2, …。这导致后续尝试获取原始键名key($speciesarray)时,得到的是数字0,而非我们期望的字符串键名。

根据PHP官方文档对shuffle()函数的说明:

“此函数会为数组中的元素分配新键。它将删除任何可能已分配的现有键,而不仅仅是重新排序键。”

这明确解释了为什么关联键名会丢失。

保留关联键名的自定义洗牌函数 shuffle_assoc()

为了在随机打乱数组的同时保留其关联键名,我们需要实现一个自定义的函数。核心思想是:首先提取出数组的所有键名,对这些键名进行随机打乱,然后依据打乱后的键名顺序重新构建一个新的数组,从而实现值随机排列但键名与值保持关联。

以下是实现这一功能的shuffle_assoc()函数:


shuffle_assoc() 函数的工作原理:

$keys = array_keys($array);:首先使用array_keys()函数获取原数组$array中的所有键名,并将它们存储在一个新的索引数组$keys中。此时$keys只包含键名,例如 [“Amanita aprica”, “Amanita augusta”, …]。shuffle($keys);:对这个只包含键名的索引数组$keys进行shuffle()操作。由于$keys本身是一个索引数组,shuffle()操作只会打乱其元素的顺序,不会影响其内容的完整性。foreach ($keys as $key) { $new[$key] = $array[$key]; }:遍历打乱后的$keys数组。对于$keys中的每一个键名$key,我们都从原始数组$array中取出对应的值$array[$key],并将其赋值给新数组$new中以$key为键的位置。这样就确保了每个原始键名与其对应的值保持关联,同时整体的顺序是随机的。$array = $new;:最后,将原始数组$array的引用指向新创建的$new数组。这样,调用shuffle_assoc()函数后,原数组$array就会被替换为打乱了顺序但保留了键名的新数组。

使用 shuffle_assoc() 解决问题

现在,我们将原始示例代码中的shuffle()调用替换为shuffle_assoc():

 "species/Amanita_aprica.html",    "Amanita augusta"         => "species/Amanita_augusta.html",    "Amanita calyptratoides"  => "species/Amanita_calyptratoides.html",    "Amanita calyptroderma"   => "species/Amanita_calyptroderma.html",    "Amanita constricta"      => "species/Amanita_constricta.html",    "Amanita gemmata"         => "species/Amanita_gemmata.html",    "Amanita magniverrucata"  => "species/Amanita_magniverrucata.html",    "Amanita muscaria"        => "species/Amanita_muscaria.html",    "Amanita novinupta"       => "species/Amanita_novinupta.html",    "Amanita ocreata"         => "species/Amanita_ocreata.html",    "Amanita pachycolea"      => "species/Amanita_pachycolea.html",    "Amanita pantherina"      => "species/Amanita_pantherina.html",    "Amanita phalloides"      => "species/Amanita_phalloides.html",    "Amanita porphyria"       => "species/Amanita_porphyria.html",    "Amanita protecta"        => "species/Amanita_protecta.html",    "Amanita pruittii"        => "species/Amanita_pruittii.html",    "Amanita silvicola"       => "species/Amanita_silvicola.html",    "Amanita smithiana"       => "species/Amanita_smithiana.html",    "Amanita vaginata"        => "species/Amanita_vaginata.html",    "Amanita velosa"          => "species/Amanita_velosa.html",    "Amanita vernicoccora"    => "species/Amanita_vernicoccora.html");// 使用自定义函数进行关联数组洗牌shuffle_assoc($speciesarray); // 第一次打乱,保留键名$speciesarray = array_slice($speciesarray, 0, 5, true); // 截取前5个,保留键名reset($speciesarray);$choice = key($speciesarray); // 获取第一个元素的键名// 调试输出print_r($speciesarray);echo("
");print_r($choice);?>

关键改进点:

shuffle_assoc($speciesarray);:替换了原有的shuffle()调用,确保键名在第一次洗牌时就被保留。array_slice($speciesarray, 0, 5, true);:在array_slice()函数中,第四个参数设置为true至关重要。这指示array_slice()在切片时保留原始数组的键名,否则它也会默认重新索引为数字键。

现在,期望的输出将与实际输出一致:

Array ( [Amanita silvicola] => species/Amanita_silvicola.html [Amanita gemmata] => species/Amanita_gemmata.html [Amanita calyptratoides] => species/Amanita_calyptratoides.html [Amanita vaginata] => species/Amanita_vaginata.html [Amanita phalloides] => species/Amanita_phalloides.html )Amanita silvicola

注意事项与总结

理解函数行为是关键: 在使用PHP内置数组函数时,务必查阅官方文档,了解其对键名处理的具体行为,尤其是在处理关联数组时。自定义函数的必要性: 当内置函数无法满足特定需求(如保留关联键名)时,编写自定义函数是常见的解决方案。shuffle_assoc()提供了一个优雅且高效的方式来解决shuffle()函数重置键名的问题。array_slice() 的第四个参数: 在截取数组时,如果需要保留原始键名,切记将array_slice()的preserve_keys参数设置为true。性能考量: shuffle_assoc()函数需要额外的步骤来提取键、打乱键和重构数组,这可能会比简单的shuffle()操作带来轻微的性能开销。然而,对于大多数非极端规模的数组操作,这种开销通常可以忽略不计,且其带来的功能正确性远比微小的性能差异更重要。

通过上述教程,我们深入理解了PHP shuffle() 函数在处理关联数组时的行为,并掌握了如何通过自定义shuffle_assoc()函数,结合array_keys()和循环重构数组的方法,实现在随机化数组元素的同时有效保留其关联键名。这对于需要维护数据标识符和值之间映射关系的PHP应用至关重要。

以上就是深入理解PHP数组洗牌与键名保留策略的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1338913.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MySQL多角色关联查询:通过多次JOIN同一表获取详细信息
上一篇 2025年12月13日 02:28:57
PHP用户类型页面访问控制教程
下一篇 2025年12月13日 02:29:10

相关推荐

  • 苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口

    苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口苹果壁纸设计网页正版访问_苹果壁纸设计网页直达入口

    苹果壁纸设计网页正版访问入口是http://eyu.zaixian-fanyi.com/fan_wei_13269529,该平台提供海量高清壁纸、支持用户上传分享、内置编辑工具并定期更新主题内容,界面简洁流畅,支持一键收藏与多设备同步,同时整合设计模板、贴纸素材与艺术字体,提升创作灵活性。 苹果壁纸…

    2026年9月25日 • 用户投稿
    000
  • MBTI测试免费入口网址_ MBTI官网免费测试网站链接

    MBTI测试免费入口网址_ MBTI官网免费测试网站链接MBTI测试免费入口网址_ MBTI官网免费测试网站链接MBTI测试免费入口网址_ MBTI官网免费测试网站链接MBTI测试免费入口网址_ MBTI官网免费测试网站链接

    MBTI测试免费入口网址是https://www.16personalities.com/,该网站提供无需注册即可参与的近百道题人格测试,耗时约10至15分钟,支持中文界面并可导出PDF报告。 MBTI测试免费入口网址在哪里?这是不少朋友都在寻找的,接下来由PHP小编为大家带来MBTI官网免费测试网…

    2026年9月25日 • 用户投稿
    300
  • sublime怎么运行php文件 _sublime PHP文件运行方法

    sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法

    首先确保PHP已安装并加入环境变量,然后在Sublime Text中创建PHP构建系统:通过Tools → Build System → New Build System…添加对应操作系统的JSON配置,保存为PHP.sublime-build至User目录;接着打开.php文件按Ctrl+ B或C…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么配置PHP CS Fixer进行代码格式化_sublime使用PHP CS Fixer自动格式化代码教程

    sublime怎么配置PHP CS Fixer进行代码格式化_sublime使用PHP CS Fixer自动格式化代码教程sublime怎么配置PHP CS Fixer进行代码格式化_sublime使用PHP CS Fixer自动格式化代码教程sublime怎么配置PHP CS Fixer进行代码格式化_sublime使用PHP CS Fixer自动格式化代码教程sublime怎么配置PHP CS Fixer进行代码格式化_sublime使用PHP CS Fixer自动格式化代码教程

    首先安装PHP CS Fixer工具并将其放置于系统指定目录,确保PHP环境正常;接着在Sublime Text中通过Package Control安装PHP CS Fixer插件;然后在插件设置中配置php_cs_fixer_exec_path和php_path指向正确的PHAR文件和PHP可执行…

    2026年9月25日 • 用户投稿
    100
  • 1688阿里巴巴官方网站 1688阿里巴巴新品快订入口

    1688阿里巴巴官方网站 1688阿里巴巴新品快订入口1688阿里巴巴官方网站 1688阿里巴巴新品快订入口1688阿里巴巴官方网站 1688阿里巴巴新品快订入口1688阿里巴巴官方网站 1688阿里巴巴新品快订入口

    1688阿里巴巴官方网站新品快订入口为https://ding.1688.com,该平台涵盖服饰、配饰、家居日用及包装物料等丰富商品类目,支持先采后付、48小时发货、混批进货等高效交易模式,并提供新人优惠、实时成交数据展示、销售趋势提示及全网截图比价等采购优化服务。 1688阿里巴巴官方网站新品快订…

    2026年9月25日 • 用户投稿
    000
  • PHP三元运算符可读性差吗_PHP三元运算符优化可读性

    三元运算符可读性取决于使用方式,合理使用能提升代码简洁性。1. 基本语法为“条件 ? 值1 : 值2”,适用于简单赋值,如根据年龄判断成年与否。2. 避免嵌套,多层三元运算符应改用 if-else 或提前返回。3. 提升可读性技巧包括:将复杂条件封装为布尔变量、换行书写嵌套表达式、仅用于赋值或返回。…

    2026年9月25日
    100
  • 苹果13微信不响怎么回事儿

    苹果13微信不响怎么回事儿苹果13微信不响怎么回事儿苹果13微信不响怎么回事儿苹果13微信不响怎么回事儿

    苹果 13 微信不响可能是由于静音模式、勿扰模式、通知设置、应用程序故障或系统更新导致。要解决此问题,请检查静音模式,关闭勿扰模式,检查通知设置,重启 iPhone,更新微信应用程序,或重置通知设置。如仍无法解决,请联系微信支持或苹果技术支持。 为什么苹果 13 微信不响? 原因: 苹果 13 微信…

    2026年9月25日 • 用户投稿
    000
  • 小红书网页版怎么绑定邮箱_小红书网页版邮箱绑定与验证

    小红书网页版怎么绑定邮箱_小红书网页版邮箱绑定与验证小红书网页版怎么绑定邮箱_小红书网页版邮箱绑定与验证小红书网页版怎么绑定邮箱_小红书网页版邮箱绑定与验证小红书网页版怎么绑定邮箱_小红书网页版邮箱绑定与验证

    小红书网页版邮箱绑定入口在“设置”-“账号与安全”中,用户登录后点击头像进入设置,选择“绑定邮箱”并输入有效地址,查收验证邮件后点击链接完成验证,即可提升账号安全性、方便找回密码、增强识别度并接收官方活动信息。 小红书网页版邮箱绑定入口在哪? 小红书网页版邮箱绑定与验证方法是许多新用户关心的问题,尤…

    2026年9月25日 • 用户投稿
    300
  • Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制

    Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制Java向上转型中可变参数方法调用的行为解析:重载与编译时绑定的深层机制

    本文深入探讨Java中向上转型、方法重载与可变参数(varargs)的交互机制。通过具体代码示例,详细解释了在向上转型场景下,为何编译器会基于引用变量的编译时类型来解析方法调用,即使子类存在看似更匹配的重载方法。核心在于方法重载是编译时决策,而可变参数在重载解析中具有较低的优先级。理解这些机制对于编…

    2026年9月25日 • 用户投稿
    000
  • 抖音平台优惠券怎么触发?抖音平台优惠券怎么触发活动

    抖音平台优惠券怎么触发?抖音平台优惠券怎么触发活动抖音平台优惠券怎么触发?抖音平台优惠券怎么触发活动抖音平台优惠券怎么触发?抖音平台优惠券怎么触发活动抖音平台优惠券怎么触发?抖音平台优惠券怎么触发活动

    随着抖音平台的火爆,越来越多的商家选择在抖音上推广自己的产品。为了吸引更多的用户购买,商家们纷纷在抖音上发放优惠券。抖音平台优惠券怎么触发呢?本文将为你揭秘抖音优惠券使用攻略,让你轻松享受优惠。 一、抖音平台优惠券触发方式 1. 关注商家账号:你需要关注你想购买商品的商家账号。只有关注了商家,你才能…

    2026年9月25日 • 用户投稿
    200
  • sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法

    sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法sublime怎么实时预览markdown文件 _sublime Markdown实时预览方法

    通过安装MarkdownPreview和LiveReload插件,可在Sublime Text中实现Markdown文件的准实时预览:先用Package Control安装插件,配置导出HTML到浏览器,再结合LiveReload实现保存即刷新,最后可设置Ctrl+Alt+M为快捷键,完成高效写作体…

    2026年9月25日 • 用户投稿
    400
  • 苹果15为什么锁屏不能黑屏呢

    苹果15为什么锁屏不能黑屏呢苹果15为什么锁屏不能黑屏呢苹果15为什么锁屏不能黑屏呢苹果15为什么锁屏不能黑屏呢

    iPhone 15 锁屏无法黑屏可能是由于始终显示时间和信息、后台应用程序活动、通知、环境光传感器异常、显示屏故障、iOS 系统错误等原因引起的。解决方法包括检查显示屏设置、关闭后台应用程序、清除通知、重启设备以及联系 Apple 支持。 苹果 15 锁屏无法黑屏的原因 苹果 15 锁屏无法黑屏可能…

    2026年9月25日 • 用户投稿
    200
  • Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践

    Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践Spring Boot 应用:分离 REST API 和 Web 应用的最佳实践

    本文旨在探讨在 Spring Boot 项目中,如何有效地分离 REST API 和 Web 应用程序。针对小型项目,建议保持简单,将代码放在同一模块的不同包中。对于大型项目,则需要考虑可伸缩性、团队协作和性能需求,将前后端分离成两个独立的 Spring Boot 应用。文章将深入分析不同场景下的架…

    2026年9月25日 • 用户投稿
    300
  • 163邮箱登录官网路径 163邮箱登录顺畅入口

    163邮箱登录官网路径 163邮箱登录顺畅入口163邮箱登录官网路径 163邮箱登录顺畅入口163邮箱登录官网路径 163邮箱登录顺畅入口163邮箱登录官网路径 163邮箱登录顺畅入口

    163邮箱登录官网路径为https://mail.163.com,支持网页、手机智能版、网易邮箱大师扫码及电脑客户端多端同步登录,结合安全验证机制与功能集成优势,提供顺畅、安全、高效的邮件管理体验。 163邮箱登录官网路径在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来163邮箱登录顺畅入…

    2026年9月25日 • 用户投稿
    1100
  • laravel怎么清除应用的所有缓存_laravel应用缓存清理方法

    Laravel应用响应异常或配置未生效时,需清除缓存。依次执行php artisan route:clear、config:clear、view:clear和cache:clear命令,可分别清除路由、配置、视图及应用缓存,确保修改生效。 如果您发现 Laravel 应用响应异常或配置更改未生效,可…

    2026年9月25日
    200
  • 疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?

    疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?

    8 月 18 日,知名数码博主曝光了魅族即将推出的 22 系列真机实拍图。从流出的照片来看,新机在外观设计上迎来重大革新,后置摄像模组由传统的竖向排列调整为方形布局,集成三到四个镜头,模组凸起较为突出,整体呈现出简洁且硬朗的视觉风格。机身侧面疑似采用直角边框设计,进一步增强了整机的立体感与辨识度。 …

    2026年9月25日 • 用户投稿
    000
  • PHP加密算法有哪些_PHP数据加密解密常用函数

    推荐使用password_hash()存储密码,openssl_encrypt()加密数据,RSA实现安全通信,根据场景选择合适加密方式保障信息安全。 在PHP开发中,数据加密和解密是保障信息安全的重要手段。根据使用场景的不同,可以选择不同的加密方式。常见的需求包括密码存储、敏感数据传输、配置文件加…

    2026年9月25日
    100
  • PHP文件引入时参数传递机制详解与最佳实践

    在php中,直接通过url查询字符串方式向`require`或`include`引入的文件传递参数是无效的,这会导致“未定义变量”错误。本文将深入探讨php文件引入的原理,并提供三种正确的参数传递方法:利用作用域共享、手动填充`$_get`数组,以及推荐的通过函数或类进行封装,旨在帮助开发者构建更健…

    2026年9月25日
    100
  • Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式Safari浏览器怎么查看网页源代码_Safari浏览器网页HTML源代码查看方式

    首先启用Safari开发菜单,然后通过菜单命令或快捷键Option+Command+U查看完整HTML源代码;也可右键选择检查元素,使用Web检查器查看特定区域的DOM结构与样式信息。 如果您在浏览网页时需要检查页面的结构或调试内容,查看网页源代码是一个常用的方法。Safari浏览器提供了多种方式来…

    2026年9月25日 • 用户投稿
    000
  • Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程Chrome浏览器怎么禁止图片和视频自动加载_网页媒体内容自动加载禁用教程

    可通过设置阻止Chrome自动加载媒体。①针对特定网站:点击地址栏锁形图标→网站设置→将“自动播放”设为不允许;②全局禁用:进入chrome://settings/content→自动播放→设为默认不允许;③使用扩展如uBlock Origin拦截媒体加载;④启用Lite模式以节省数据并延迟媒体加载…

    2026年9月25日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信