程序员轻松学PHP,将混乱思维拨乱反正的3种方法
yuyutoo 2024-10-31 16:42 4 浏览 0 评论
将混乱思维拨乱反正的3种方法
要用PHP解决生活中的实际问题,不是几个简单的选择和循环结构、函数就能够搞定的。因为这些问题往往由很多功能组成,对于初学编程的读者来说,在面对复杂的问题时,往往思维非常混乱。为此,在解决问题前,先学习一些理清混乱思维的方法。
1 伪代码
编程其实就是用编程语言将我们大脑的想法表示出来。一个项目往往由很多功能需求组成,而每个功能需求的实现又需要写很多的代码,所以在真实编码之前可以用伪代码将代码框架或轮廓搭建好,再以这个伪代码为基础,编写各种编程语言对应的代码,从而完成项目的每个功能需求,继而完成整个项目。
1.1 第1个需求的实现
先来看第1个需求,即将表2-1中日期为2018-06-10的数据输出到浏览器,下面是我们思考的过程。
(到现在为止,我仅仅学过选择结构和循环结构、函数、变量等基础知识。
(在代码清单2-17中已经用$billData这个数组变量将表格2-1中的所有数据表示出来了。
(用循环结构对$billData进行遍历,获得每行数据,包括日期,然后判断日期是否为2018-06-10。
(输出结果。
下面我们利用伪代码将上面的想法表示出来,如代码清单3-1所示。
代码清单1-1 first_need_one.php
1. <?php 2. //循环遍历所有记账数据 3. foreach (所有记账数据 as 目前记账) { 4. //目前记账数据,包括日期、金额、备注等 5. if (目前记账日期等于2018-06-10) { 6. //输出该行数据; 7. //已经找到所需要的数据,退出循环; 8. } 9. } 10. 11. //其他代码逻辑
如代码清单1-1所示,我们用伪代码将第1个需求的代码框架表示出来了。
1.1.2 文件包含
如代码清单1-1所示,我们需要引用代码清单2-17中的变量$billData,也就是说,需要在first_need_one.php中将代码清单2-17对应的PHP文件bill_data.php包含进来,要不然会出现变量未定义错误。
PHP提供了以下几种方式来进行文件包含。
(include将文件包含进来并且执行,如文件不存在,就抛出一个警告,但不中断PHP代码的运行。
(include_once和include一样,唯一的区别就是先检查是否已经包含该文件。
(require和include一样,唯一的区别就是文件不存在会中断PHP代码的运行。
(require_once和include_once一样,唯一的区别就是文件不存在会中断PHP代码的运行。
现在将bill_data.php文件复制到和first_need_one.php一样的目录中以进行直接包含。在伪代码1-1的基础之上,实现第1个需求的实际代码如代码清单3-2所示。
代码清单1-2 first_need_two.php
1. <?php 2. include 'bill_data.php'; 3. foreach ($billData as $val) { 4. if ($val['date'] == '2018-06-10') { 5. //将数据输出到浏览器 6. echo '日期为:' . $val['date'] . PHP_EOL; 7. echo '金额为:' . $val['money'] . PHP_EOL; 8. echo '备注为:' . $val['comment']; 9. break; 10. } 11. } 12. //其他代码逻辑
如代码清单1-2所示,我们用PHP将需求1成功实现了。打开浏览器访问view-source:http:// www.myself.personsite/first_need_two.php,代码清单1-2的运行结果如图1-1所示。
图1-1 代码清单1-1的运行结果
1.1.3 第2个需求的实现
面对第2个需求,即将表2-1中金额小于0并且日期月份是6月的前3条数据输出到浏览器,下面是我们思考的过程。
(有了第1个需求实现的基础,现在同样利用foreach来遍历数组变量$billData。
(输出的数据必须满足3个条件:金额小于0,月份是6月,是否在第3条以内。
(判断目前元素的金额,如果小于0满足条件1。
(判断目前元素的日期,如果月份是6月那么满足条件2。
(打开PHP手册,看日期函数部分,发现可以用date和strtotime两个内置函数将记账日期中的月份提取出来。
(定义一个变量保存满足记录的条数,每获取一条满足的数据,就将这个变量加1。
(当满足条件的记录数为3时,即使数据满足条件也不输出。
(3个条件必须同时满足,所以用&&进行连接。
(输出结果。
下面我们利用伪代码将思考的过程表示出来,如代码清单1-3所示。
代码清单1-3 second_need_one.php
1. <?php 2. 已满足记录数 = 0; 3. //输出所有数据 4. foreach (所有记账数据 as 目前记账) { 5. if (已满足记录数大于等于3) 终止循环遍历,执行其他代码逻辑; 6. if ( 7. 目前记账金额小于0 && 8. 目前记账月份等于06 && 9. 已满足记录数小于3 10. ) { 11. //输出该行数据 12. //将已满足记录数加1 13. } 14. } 15. 16. //其他代码逻辑
如代码清单1-3所示,我们用伪代码将第2个需求的代码框架表示出来了。现在在伪代码的基础上,我们来实现第2个需求的真实代码,如代码清单1-4所示。
代码清单1-4 second_need_two.php
1. <?php 2. include 'bill_data.php'; 3. $fulfilCount = 0; 4. //循环遍历所有数据 5. foreach ($billData as $val) { 6. /** 7. * 因为已经找到了满足条件的3条数据,所以结束循环 8. */ 9. if ($fulfilCount >= 3) break; 10. if ($val['money'] < 0 && 11. date('m', strtotime($val['date'] . ' 00:00:00')) == '06' && 12. $fulfilCount < 3 13. ) { 14. //将满足的数据输出到浏览器 15. echo '日期为:' . $val['date']; 16. echo ',金额为:' . $val['money']; 17. echo ',备注为:' . $val['comment'] .PHP_EOL; 18. //每满足一条数据,就将$fulfilCount加1 19. $fulfilCount++; 20. } 21. } 22. //其他代码逻辑
如代码清单1-4所示,我们用PHP代码将需求2成功实现了,打开浏览器访问http://www.myself.personsite/second_need_two.php,代码清单1-4的运行结果如图1-2所示。
图1-2 代码清单1-4的运行结果
1.4 第3个需求的实现
对于第3个需求,即统计表2-1中每个月的收入支出总金额,并且以表2-2的形式呈现出来.面对这个需求,想必很多初学者思维开始有些混乱了,下面是我们思考的过程。
(仔细观察表2-2,我们发现它可以用数组进行表示,如代码清单1-5所示,以月份作为数组的索引(key),将收入和支出金额一起作为数组索引对应的值(value)。所以现在的任务就是遍历所有记账数据以生成这个数组。
(用foreach遍历所有的记账数据,我们能够获取每一条记账金额,将金额和0比较得到是收入还是支出金额,同时由第2个需求,我们可以得到日期月份。
(要是有一个检查数组索引是否存在的函数就好了,这样我们就能够检查目前记账日期对应的月份是否已经在数组的所有索引里面。如果没在,就新增一个数组元素,并且该元素的索引为记账日期对应的月份,该元素的值为收入和支出金额。根据记账金额和0进行比较而进行初始化,如果在索引中,则累加收入或支出金额。
(打开PHP手册,继续找到数组扩展函数部分,发现可以利用array_key_exists函数来实现检查数组索引是否已经存在的需求,此时所有技术难点都被突破。
(输出结果。
代码清单1-5 third_need_one.php
1. <?php 2. //显示数据结构 3. $viewData = [ 4. 6 => [ 5. 'income' => '收入金额', 6. 'consume' => '支出金额' 7. ], 8. 7 => [ 9. 'income' => '收入金额', 10. 'consume' => '支出金额' 11. ], 12. 8 => [ 13. 'income' => '收入金额', 14. 'consume' => '支出金额' 15. ], 16. ];
下面我们利用伪代码将上面思考的过程表示出来,如代码清单1-6所示。
代码清单1-6 third_need_two.php
1. <?php 2. foreach (所有记账数据 as 目前记账) { 3. //提取目前记账的数字月份 4. if (该月份已经存在) { 5. if (目前金额小于0) { 6. //支出累加 7. } else { 8. //收入累加 9. } 10. } else { 11. if (目前金额小于0) { 12. //令支出等于目前金额 13. //令收入等于0 14. } else { 15. //令支出等于0 16. //令收入等于目前金额 17. } 18. } 19. } 20. //其他代码逻辑
如代码清单1-6所示,我们用伪代码将第3个需求的代码框架表示出来了。现在在伪代码的基础上,我们来实现第3个需求的真实代码,如代码清单1-7所示。
代码清单1-7 third_need_three.php
1. <?php 2. include 'bill_data.php'; 3. //定义一个保存返回值的数组变量 4. $viewData = []; 5. foreach ($billData as $val) { 6. //n表示输出没有数字0的数字月份 7. $curMonth = date('n', strtotime($val['date'] . ' 00:00:00')); 8. if (array_key_exists($curMonth, $viewData)) { 9. //如果目前月份已经存在,就累加 10. if ($val['money'] < 0) { 11. //如果目前金额小于0,那么就是支出累加,否则是收入累加 12. $viewData[$curMonth]['consume'] += $val['money']; 13. } else { 14. $viewData[$curMonth]['income'] += $val['money']; 15. } 16. } else { 17. //如果没有统计过,就新增 18. if ($val['money'] < 0) { 19. //如果目前金额小于0,那么支出金额为目前金额,收入金额为0 20. $viewData[$curMonth]['consume'] = $val['money']; 21. $viewData[$curMonth]['income'] = 0; 22. } else { 23. $viewData[$curMonth]['consume'] = 0; 24. $viewData[$curMonth]['income'] = $val['money']; 25. } 26. } 27. } 28. //其他代码逻辑 29. print_r($viewData);
如代码清单1-7所示,我们用PHP代码将需求3成功实现了。打开浏览器访问view-source: http://www.myself.personsite/third_need_three.php,代码清单1-7的运行结果如图1-3所示。
图1-3 代码清单1-7的运行结果
1.2 思维导图工具
面对复杂的问题,我们的大脑为什么会一片空白?最根本的原因有两个,一个是没有经验且基础知识储备不足,另一个原因就是我们的想法没有得到形象化的表示。因为复杂的问题需要想很长时间或者实现时需要很多步骤,如果我们将每次想的结果用图的方式保存起来,这样就能够迅速地将复杂问题的逻辑理清楚。
1.2.1 任务需求
假设现在我们需要实现一个基于PC端的个人商家(C2B)电商平台网站,现在让你以产品经理的身份理一下这个网站需要哪些功能,然后将其整理成文档交给相关同事。
拿到这个任务后,你很头疼,一方面自己没有编程基础,另一方面自己也没有做过这种类型的网站,甚至还不是产品经理。
1.2.2 第1阶段
由于有过购物的经验,所以你很清楚,至少该平台有用户和商家这两个角色。从这两个角色出发,并根据丰富的购物经验,你很快就得到了第一个思维导图。
如图1-4所示,我们得到了这个电商平台的最简单、最基础的思维导图,从图中能够清楚看到用户和商家的功能有哪些。
图1-4 最基础的思维导图
1.2.3 第2阶段
当想到用户能够对商品进行评论的时候,一个问题突然出现在我的眼前,万一用户发表一些国家法律禁止的内容怎么办?同样,商品内容和名称、用户名称等都存在这个问题,于是我们不得不增加一个专门审核各种内容的角色。
如图1-5所示,为了对各种内容进行审核,我们增加了审核人这样一个角色。
图1-5 增加审核人的思维导图
1.2.4 第3阶段
好啦,图1-5已经将功能描述完了,可以睡觉了。躺在床上回顾图1-5,才发现还有一个重大功能没有,就是怎么查看平台有多少用户、多少商家、多少商品、多少评论等,而这个功能一般都是超级管理员才可以看到,所以思维导图进化到图1-6。
图1-6 拥有超级管理员的思维导图
经过3个阶段的练习,我们发现自己似乎已经学会了整理混乱的需求。同样针对一些复杂逻辑,我们也可以采用这种方式来将零散的、混乱的思维变成一张张形象的图。
1.3 自顶向下逐步细化的方法
在生活中有一个很有趣的体验,大家应该都经历过,就是手里拿着一本书,仅仅看目录就知道这本书写的是什么。
如图1-7所示,我们发现之所以看目录就能够知道整本书将什么,就是因为它从顶部开始,将书分成了几个独立的大块,然后继续对每个大块拆分,形成更小的块,直到无法再分。
图1-7 书的组织结构图
和目录一样,我们在今后的项目中也会遇到很复杂的功能需求,这个时候就可以利用自顶向下逐步细化的方法将复杂的问题分成几个大块,然后不断细化大块,直到自己对功能需求非常了解了,这个时候就能够用函数或者方法来实现了。从某种程度上来看,这种方法的思想就是将复杂问题简单化。
1.4 习题
作业1:熟悉用自顶向下、逐步细化的方法将复杂的问题简单化。
作业2:掌握用伪代码来描述一个复杂功能的代码框架或者轮廓。
作业3:掌握用各种图将复杂问题化抽象为具体的方法,从而更利于我们解决问题。
内容简介:
全书共分12章,包括PHP的基础知识、MySQL的相关知识、内置函数、面向对象与数据库的相关知识、记账网站的实现、微信开发以及图片上传的原理等。书中的知识结合生活实例进行讲解,而且设计的程序代码也给出了详细的注释,可以使读者轻松掌握PHP程序开发相关知识,快速提高专业开发技能。
相关推荐
- 【Socket】解决UDP丢包问题
-
一、介绍UDP是一种不可靠的、无连接的、基于数据报的传输层协议。相比于TCP就比较简单,像写信一样,直接打包丢过去,就不用管了,而不用TCP这样的反复确认。所以UDP的优势就是速度快,开销小。但是随之...
- 深入学习IO多路复用select/poll/epoll实现原理
-
Linux服务器处理网络请求有三种机制,select、poll、epoll,本文打算深入学习下其实现原理。0.结论...
- 25-1-Python网络编程-基础概念
-
1-网络编程基础概念1-1-基本概念1-2-OSI七层网络模型OSI(开放系统互联)七层网络模型是国际标准化组织(ISO)提出的网络通信分层架构,用于描述计算机网络中数据传输的过程。...
- Java NIO多路复用机制
-
NIO多路复用机制JavaNIO(Non-blockingI/O或NewI/O)是Java提供的用于执行非阻塞I/O操作的API,它极大地增强了Java在处理网络通信和文件系统访问方面的能力。N...
- Python 网络编程完全指南:从零开始掌握 Socket 和网络工具
-
Python网络编程完全指南:从零开始掌握Socket和网络工具在现代应用开发中,网络编程是不可或缺的技能。Python提供了一系列高效的工具和库来处理网络通信、数据传输和协议操作。本指南将从...
- Rust中的UDP编程:高效网络通信的实践指南
-
在实时性要求高、允许少量数据丢失的场景中,UDP(用户数据报协议)凭借其无连接、低延迟的特性成为理想选择。Rust语言凭借内存安全和高性能的特点,为UDP网络编程提供了强大的工具支持。本文将深入探讨如...
- Python 网络编程的基础复习:理解Socket的作用
-
计算机网络的组成部分在逻辑上可以划分为这样的结构五层网络体系应用层:应用层是网络协议的最高层,解决的是具体应用问题...
- 25-2-Python网络编程-TCP 编程示例
-
2-TCP编程示例应用程序通常通过“套接字”(socket)向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。Python语言提供了两种访问网络服务的功能。...
- linux下C++ socket网络编程——即时通信系统(含源码)
-
一:项目内容本项目使用C++实现一个具备服务器端和客户端即时通信且具有私聊功能的聊天室。目的是学习C++网络开发的基本概念,同时也可以熟悉下Linux下的C++程序编译和简单MakeFile编写二:需...
- Python快速入门教程7:循环语句
-
一、循环语句简介循环语句用于重复执行一段代码块,直到满足特定条件为止。Python支持两种主要的循环结构:for循环和while循环。...
- 10分钟学会Socket通讯,学不会你打我
-
Socket通讯是软硬件直接常用的一种通讯方式,分为TCP和UDP通讯。在我的职业生涯中,有且仅用过一次UDP通讯。而TCP通讯系统却经常写,正好今天写了一个TCP通讯的软件。总结一下内容软件使用C#...
- Python 高级编程之网络编程 Socket(六)
-
一、概述Python网络编程是指使用Python语言编写的网络应用程序。这种编程涉及到网络通信、套接字编程、协议解析等多种方面的知识。...
- linux网络编程Socket之RST详解
-
产生RST的三个条件:1.目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;2.TCP想取消一个已有的连接;3.TCP接收到一个根本不存在的连接上的分节;现在模拟上面的三种情况:cl...
- Python中实现Socket通讯(附详细代码)
-
套接字(socket)是一种在计算机网络中进行进程间通信的方法,它允许不同主机上的程序通过网络相互通信。套接字是网络编程的基础,几乎所有的网络应用程序都使用某种形式的套接字来实现网络功能。套接字可以用...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)