您的位置 首页 php

程序员轻松学PHP,将混乱思维拨乱反正的3种方法

将混乱思维拨乱反正的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成功实现了,打开浏览器访问,代码清单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: ,代码清单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程序开发相关知识,快速提高专业开发技能。

文章来源:智云一二三科技

文章标题:程序员轻松学PHP,将混乱思维拨乱反正的3种方法

文章地址:https://www.zhihuclub.com/78507.shtml

关于作者: 智云科技

热门文章

网站地图