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

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...