当前位置: 首页 > news >正文

PHP 循环控制结构深度剖析:从基础到实战应用

PHP 循环控制结构深度剖析:从基础到实战应用

PHP提供了多种控制结构,其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码,直到满足某个条件为止。本文将从PHP循环的基础知识出发,逐步分析其在实际项目中的应用。

1. PHP循环类型概述

PHP主要有四种常见的循环控制结构:

  • for 循环
  • while 循环
  • do-while 循环
  • foreach 循环

2. for 循环

for循环用于已知次数的循环。通常,当我们知道循环应该执行多少次时,使用for循环非常合适。其基本语法结构如下:

for (初始化; 条件; 更新) {// 循环体
}
  • 初始化:设定初始条件,通常用于设置循环变量的初值。
  • 条件:每次循环前都会进行判断,只有条件为true时,循环体才会执行。
  • 更新:每次循环结束后会执行此部分,通常用于更新循环变量。
示例:打印1到10的数字
for ($i = 1; $i <= 10; $i++) {echo $i . "<br>";
}
详细分析:
  • 初始化$i = 1:这是开始计数的初始值。
  • 条件$i <= 10:当$i小于或等于10时,循环会继续。
  • 更新$i++:每次循环后,$i会增加1。

3. while 循环

while循环在条件满足时持续执行,适用于不确定执行次数,但明确条件的情况。它的基本语法如下:

while (条件) {// 循环体
}
示例:打印1到10的数字
$i = 1;
while ($i <= 10) {echo $i . "<br>";$i++;  // 更新循环变量
}
详细分析:
  • 循环条件$i <= 10会在每次循环前判断,如果为true,执行循环体;如果为false,退出循环。
  • 更新循环变量$i++,否则会陷入无限循环。

4. do-while 循环

do-while循环与while循环类似,但不同的是,do-while会先执行一次循环体,再进行条件判断。因此,do-while循环至少会执行一次。其基本语法如下:

do {// 循环体
} while (条件);
示例:打印1到10的数字
$i = 1;
do {echo $i . "<br>";$i++;
} while ($i <= 10);
详细分析:
  • 在此例中,$i会先被输出一次,之后才会进行条件判断。

5. foreach 循环

foreach循环是用于遍历数组的专用循环。它可以遍历数组中的每一个元素,并进行处理。常用于操作数组。其基本语法如下:

foreach ($array as $key => $value) {// 循环体
}
  • $array:待遍历的数组。
  • $key:当前元素的键(可选)。
  • $value:当前元素的值。
示例:遍历一个数组并打印每个值
$array = [1, 2, 3, 4, 5];
foreach ($array as $value) {echo $value . "<br>";
}
示例:遍历关联数组
$associativeArray = ['apple' => 5, 'banana' => 2, 'cherry' => 8];
foreach ($associativeArray as $key => $value) {echo $key . " => " . $value . "<br>";
}

6. 实战应用:复杂条件下的循环

在实际项目中,循环控制结构常常需要结合复杂的业务逻辑。我们来看一个更复杂的例子:处理订单数据。

假设我们有一个在线商店,客户可以购买多个商品。我们需要遍历客户的订单,计算每个订单的总价并输出,若订单总价超过某个阈值,送赠品。

订单数据结构:
$orders = [['order_id' => 1, 'items' => [['product' => 'Laptop', 'price' => 1000, 'quantity' => 1],['product' => 'Mouse', 'price' => 50, 'quantity' => 2]]],['order_id' => 2, 'items' => [['product' => 'Phone', 'price' => 600, 'quantity' => 1],['product' => 'Charger', 'price' => 30, 'quantity' => 1]]]
];
计算每个订单总价并添加赠品:
foreach ($orders as $order) {$orderTotal = 0;foreach ($order['items'] as $item) {$orderTotal += $item['price'] * $item['quantity'];}echo "Order ID: " . $order['order_id'] . "<br>";echo "Total Price: $" . $orderTotal . "<br>";if ($orderTotal > 500) {echo "You get a free gift!<br>";}echo "<hr>";
}
代码解析:
  • 第一层foreach循环遍历每个订单。
  • 第二层foreach循环遍历每个订单中的商品,累加商品的价格。
  • 根据订单的总价,判断是否符合赠品条件(大于500元)。
  • 输出订单信息和赠品信息。

7. 实战应用:嵌套循环

在实际开发中,我们有时需要处理更复杂的数据结构。例如,处理一个多维数组,这时就需要使用嵌套循环。

示例:处理多维数组

假设我们有一个包含多个类成绩的数组,我们需要遍历每个班级的每个学生成绩,并输出成绩和平均分。

$classes = ['Class A' => [['name' => 'John', 'score' => 85],['name' => 'Alice', 'score' => 90]],'Class B' => [['name' => 'Bob', 'score' => 78],['name' => 'Charlie', 'score' => 88]]
];foreach ($classes as $class => $students) {echo "Class: " . $class . "<br>";$totalScore = 0;$studentCount = count($students);foreach ($students as $student) {echo $student['name'] . ": " . $student['score'] . "<br>";$totalScore += $student['score'];}$averageScore = $totalScore / $studentCount;echo "Average Score: " . $averageScore . "<br><hr>";
}
代码解析:
  • 外层foreach遍历班级。
  • 内层foreach遍历每个班级的学生成绩。
  • 计算每个班级的平均分并输出。

8. 总结

  • for循环适合已知循环次数的情况。
  • while循环适用于不确定循环次数但明确循环条件的情况。
  • do-while循环确保循环至少执行一次。
  • foreach循环专门用于数组,特别是关联数组。

在实际项目中,我们经常需要结合条件判断和嵌套循环来处理复杂的数据和业务逻辑。了解每种循环的适用场景和用法,能够帮助我们编写更高效、易维护的代码。

相关文章:

PHP 循环控制结构深度剖析:从基础到实战应用

PHP 循环控制结构深度剖析&#xff1a;从基础到实战应用 PHP提供了多种控制结构&#xff0c;其中循环控制结构是最常见的结构之一。它们使得我们能够高效地重复执行一段代码&#xff0c;直到满足某个条件为止。本文将从PHP循环的基础知识出发&#xff0c;逐步分析其在实际项目…...

vue的属性绑定

重建一个新的项目 App.vue main.js HelloWorld.vue 属性绑定 双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令 <template><div v-bind:id"dynamicId" v-bind:class"dynamicClass">…...

FFmpeg音视频流媒体,视频编解码性能优化

你是不是也有过这样一个疑问&#xff1a;视频如何从一个简单的文件变成你手机上快速播放的短片&#xff0c;或者是那种占满大屏幕的超高清大片&#xff1f;它背后的法宝&#xff0c;离不开一个神奇的工具——FFmpeg&#xff01;说它强大&#xff0c;完全不为过&#xff0c;它在…...

16_Redis Lua脚本

Redis Lua脚本是Redis提供的一种强大的扩展机制。 1.Redis Lua脚本介绍 1.1 基本概念 Redis Lua脚本允许开发者将一段Lua语言编写的代码发送给Redis服务器执行。这项功能自Redis 2.6版本引入以来,为用户提供了强大的灵活性和扩展能力,使得可以在Redis内部直接处理复杂的业…...

Redis为 List/Set/Hash 的元素设置单独的过期时间

一.业务简介 我们知道&#xff0c;Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间&#xff0c;只能给整个列表、集合或者 Hash 设置过期时间。 这样&#xff0c;当 List/Set/Hash 过期时&#xff0c;里面的所有 field 元素就全部过期了。但这样并不…...

鸿蒙中调整应用内文字大小

1、ui Stack() {Row() {ForEach([1, 2, 3, 4], (item: number) > {Text().width(3).height(20).backgroundColor(Color.Black).margin(item 2 ? { left: 8 } : item 3 ? { left: 7 } : { left: 0 })})}.width(97%).justifyContent(FlexAlign.SpaceBetween).padding({ ri…...

计算机网络之---防火墙与入侵检测系统(IDS)

防火墙与入侵检测系统(IDS) 防火墙&#xff08;Firewall&#xff09; 和 入侵检测系统&#xff08;IDS, Intrusion Detection System&#xff09; 都是网络安全的关键组件&#xff0c;但它们的作用、功能和工作方式有所不同。 防火墙 防火墙是网络安全的一种设备或软件&#…...

KG-CoT:基于知识图谱的大语言模型问答的思维链提示

一些符号定义 知识图谱实体数量&#xff1a; n n n 知识图谱中关系类型数量&#xff1a; m m m 三元组矩阵&#xff1a; M ∈ { 0 , 1 } n n m \textbf{M} \in \{0, 1\}^{n \times n \times m} M∈{0,1}nnm&#xff0c; M i j k 1 M_{ij}^k 1 Mijk​1则说明实体 i i i和实…...

【JMeter】多接口关联

1. 同一线程组内,如何实现多接口关联 非加密的值 前置接口的返回单条数据使用Json提取器提取前置接口的返回多条数据使用Json提取器+逻辑控制器Loop Controller前置接口的返回多条数据使用Json提取器+逻辑控制器forEach加密的值 前置接口的返回值使用Beanshell后置提取器存储为…...

2020 年 12 月青少年软编等考 C 语言五级真题解析

目录 T1. 漫漫回国路思路分析T2. 装箱问题思路分析T3. 鸣人和佐助思路分析T4. 分成互质组思路分析T1. 漫漫回国路 2020 年 5 月,国际航班一票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考…...

前端实时显示当前在线人数的实现

实时显示当前在线人数的实现 本文档提供了在网页上实时显示当前在线人数的多种实现方法&#xff0c;包括使用 WebSocket 实现实时更新和轮询方式实现非实时更新。 方法一&#xff1a;使用 WebSocket 实现实时更新 服务器端设置 通过 Node.js 和 WebSocket 库&#xff08;如 …...

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…...

vscode 无法使用npm, cmd命令行窗口可以正常执行

解决方法&#xff1a; 执行命令获得命令的位置 get-command npm 得到如下 然后删除或者修改 npm.ps1文件 让其不能使用就行。然后重启vscode即可。 pnpm 同理即可 另外加速源 国内镜像源&#xff08;淘宝&#xff09;&#xff1a; npm config set registry https://regist…...

Leetcode 967 Numbers With Same Consecutive Differences

题意 给定n&#xff0c;代表整数的长度&#xff0c;给定k代表两个相邻数字之间的间隔。求所有的值构成的组合 题目链接 https://leetcode.com/problems/numbers-with-same-consecutive-differences/description/ 题解 dfs&#xff0c;有k位置要选&#xff0c;第一个位置我…...

node.js中实现token的生成与验证

Token&#xff08;令牌&#xff09;是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中&#xff0c;Token常用于身份验证和授权&#xff0c;确保用户能够安全地访问受保护的资源。 作用与意义 身份验证&#xff1a;Token可以用来验证用户的身份&#xff0…...

[C++11]_[初级]_[工作线程如何监听主线程条件变量wait_for方法的使用]

场景 在开发多线程程序时&#xff0c;有时候需要启动一个线程来监听外部进程的执行情况&#xff0c;并且在指定时间如果还没运行结束就强制结束外部线程。那么C标准库有这种监听线程并能在超时时提示的方法吗&#xff1f; 说明 在C11的<condition_variable>里就可以用…...

Openstack持久存储-Swift,Cinder,Manila三者之间的区别

总结不易&#xff0c;给个三连吧&#xff01;&#xff01;&#xff01; 补充&#xff1a; 文件共享存储服务Manila 在OpenStack生态系统中&#xff0c;Cinder和Manila分别提供了两种不同类型的存储服务&#xff0c;类似于传统的SAN&#xff08;存储区域网络&#xff09;和NAS&…...

深度学习第三弹:python入门与线性表示代码

一、python入门 1.熟悉基础数据结构——整型数据&#xff0c;浮点型数据&#xff0c;列表&#xff0c;字典&#xff0c;字符串&#xff1b;了解列表及字典的切片&#xff0c;插入&#xff0c;删除操作。 list1 [1, 2, 3, 4, 5] for each in list1:print(each) print(list1[1…...

解决报错记录:TypeError: vars() argument must have __dict__ attribute

解决报错记录&#xff1a;manager_pyplot_show vars(manager_class).get(“pyplot_show“) TypeError: vars() argument must 1.问题引申 在pycharm中调用matplotlib函数批量绘制维度图时&#xff0c;抛出异常&#xff1a; manager_pyplot_show vars(manager_class).get(&…...

SpringBoot 原理篇(day14)

配置优先级 SpringBoot 中支持三种格式的配置文件&#xff1a; 配置文件优先级排名&#xff08;从高到低&#xff09;&#xff1a; properties 配置文件yml 配置文件yaml 配置文件 注意事项 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...