当前位置: 首页 > 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;推荐…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...