百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

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

citgpt 2024-09-26 11:29 7 浏览 0 评论

将混乱思维拨乱反正的3种方法

要用PHP解决生活中的实际问题,不是几个简单的选择和循环结构、函数就能够搞定的。因为这些问题往往由很多功能组成,对于初学编程的读者来说,在面对复杂的问题时,往往思维非常混乱。为此,在解决问题前,先学习一些理清混乱思维的方法。

1 伪代码

编程其实就是用编程语言将我们大脑的想法表示出来。一个项目往往由很多功能需求组成,而每个功能需求的实现又需要写很多的代码,所以在真实编码之前可以用伪代码将代码框架或轮廓搭建好,再以这个伪代码为基础,编写各种编程语言对应的代码,从而完成项目的每个功能需求,继而完成整个项目。

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

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程序开发相关知识,快速提高专业开发技能。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: