php总结

js           php

基本数据类型    基本数据类型
数值        整型int integer
字符串         浮点型float
布尔        字符型String
          布尔型Boolean

复合数据类型    复合数据类型
数组        数组Array
函数       对象Object
对象

特殊数据类型    特殊数据类型
undefined       null
nul         l resource(资源类型)

老师讲的,apache3条命令加php
php2条命令操作mysql

1,标量类型(简单类型)

本质上只能放单项信息
浮点数,保存的都是近似值,而不是精确值

 

---------------------
2,复合类型
可以存放多项信息


-------------------------------------
localhost
127.0.0.1
192.168.0.1
htdocs默认的文档根目录
安装,自定
常用的2种管理方式
环境变量,设置了的话,打开cmd窗口后,就是直接打开对应的服务,而不是最原始1
那样,就不用每一个都要向声明打开那个软件,才能操作,就直接操作了
httpd -M
当前apache已经加载的模块

 

打开httpd.conf文件
.dll 动态链接库
--------------------------------------
php中的常量
define("常量名","常量值",true);
1,常量名前不能加$
2,常量一经定义就不能改变值
3,常量可以在任何位置定义
4,第三个参数是定义是否大小写

defined判断是否常量
var_dump defined('常量名')
unset($a);删除


新版本的php
constant 常量名=值
echo 常量名;
echo constant('名字');

预定义的常量
get_defined_constant()

魔术常量
__LINE__ 返回当前行数;
__FILE__ 返回当前文件的完整路径名
__DIR__ 返回当前文件的路径名
__FUNCTION__ 返回当前函数名
__CLASS__ 返回当前class名
__MERHOD__ 返回当前方法的名字

php中的错误处理
1,@错误抑制符
2,php.ini display_errors=Off On改为Off
PHP程序在语句前面添加符号@的功能是:如果这个语句出现错误,错误信息不显示在网页上。

echo() 不是函数, 仅能输出标量类型,不会返回值
print() 是一个函数,仅能输出标量类型,会返回值
print_r() 是一个函数,以容易理解的方法输出复合数据类型
var_dump() 以更详细的信息显示复合数据类型,这般是程序员使用调用

----------------------------------------------
在javascript里边可以通过encodeURIComponent ()对特殊符号等信息进行编码。
在php里边可以函数 urlencode()/urldecode()对特殊符号进行编码、反编码处理
特殊字符:

 


/**
* 函数的功能
* @param 参数的类型 参数名1 参数解释
* @param 参数的类型 参数名2 参数解释
* @return 返回值的类型 返回值的解释
* @author 作者
* 修改时间
*/

 

/*//print
print('itcast');
print 3+2;

//echo语句
echo'itcast',"-php";//这种方法比较快
echo 'itcast'.'-php';

//var_dump语句
//print_r语句
//一般用来打印数组
//printf语句
//比较擅长输出由静态文本和其他变量所组成的“混合产物”

$name='jom';
$age=20;
printf("My name is %s,I am %d years old!",$name,$age);

%c:将后面的变量认为是一个整数,并且显示为对应的ASCII码字符
%d:将后面的变量认为是一个整数,并且显示为有符号的十进制数
%u:将后面的变量认为是一个整数,并且显示为无符号的十进制数
%o:将后面的变量认为是一个整数,并且显示为无符号的八进制数
%x:将后面的变量认为是一个整数,并且显示为无符号的十六进制数
%f:将后面的变量认为是一个浮点数,并且显示为浮点数
%s:将后面的变量认为是一个字符串,并且显示为字符串
*/


//可变变量的用法,以后可变函数,可变对象,可变类,可变方法,统称可变语法
/*$b='abc';
$abc=123;
echo $$b;//变量名其实是$($b), 也就是$abc 结果就是123;
echo "<hr/>";
//可变变量案例
$v1=13;
$v2=45;
$v3=76;
$v4=90;
$v5=64;

$sum=0;
for($i=1;$i<=5;$i++){
$v='v'.$i;//第一次循环$v='v1'
$sum +=$$v;
}

echo $sum;
-----------------------------------------
一般输出

<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
var_dump($_SERVER);

-----------------------------------------

 

一般转换
67/2 1
33

33/2 1
16

16/2 0
8

8/2 0
4

4/2 0
2

2/2 0
1

1/2 1
0

 

超级进制转换
67
64 32 16 8 4 2 1
1 0 0 0 0 1 1

769
512 256 128 64 32 16 8 4 2 1
1 1 0 0 0 0 0 0 0 1

十进制


二进制


八进制 十六进制

 


二进制负,是补码形式保存在计算机
比如-3
原码
10000011第一位符号位,后面11就是3
反码
11111100
补码就是
11111101


421
|
5
101
4
100


位运算最快的
爆灯,亮灯
位运算符在实际项目中,一般用来管理一组开关
这里的值仅仅表示一种状态!(此处参考非诚勿扰)
在项目:是否上架,是否精品。是否促销。是否打折。是否包邮,是否货到付款,是否进口

-----------------------------------
第34讲,错误抑制符
错误抑制符
@
作用:抑制错误,不让错误出现
echo @$a;
用的最多的是连接数据库的时候!
一般来说,即使出现错误,

new 实例化一个对象
-----------------------------------
字符编码
最高位为0

0 48
a 65
A 97

一个字节8位

一个字符4个字节
-----------------------------------------

php中字符的处理
转义符 反斜杠
\r 回车
\n 换行
\t 制表符
\\ \
\$ $
\' 单引号
\" 双引号

定义一个字符型变量
第一种:使用单引号
$str='zhang\'sa\na\ra\taa\\aa\$';
单引号中能被转义的字符有 ' \
单引号中的变量不能被解析

第二种:使用双引号 都能转义
$str='zhang\'sa\na\ra\taa\\aa\$';
双引号中能被转义的字符有 \r\n\t \$ \" \\
双引号中的变量能被解析

第三种:使用定界符如同双引号的作用{用于定义html和js}
结束标示符前。注意不能有空格
<<<abc
abc;

$s2=<<<STR
<script type="text/javascript">
alert("Hello,world!");
</script>
STR;

echo $s2;


第四种:使用定界符如同单引号的作用{用于定义html和js}
<<<'开始标记'
字符串内容
结束标记;


$s2=<<<'STR'
<script type="text/javascript">
alert("Hello,world!");
</script>
STR;

echo $s2;

 

适用于复杂的,多行的字符串

花括号也就是大括号{ }用法:
第一种:定义一个代码段
function func1(){
//your code;
}

第二种:表示字符串中某个字符的下标

第三种:界定变量名

---------------------------------------------
PHP中的运算符----
数值运算符
赋值运算符
字符串运行
三目运算符
比较运算符
逻辑运算符

-------------------------------
PHP中数据传递方式
赋值传递

引用传递
对象,资源


----------------------------------------
浏览器向服务器传递数据的方法

第一种:for表单
get url? &
post 将数据放在http内部
第二种:使用<a>连接
<a href="url?id=10&nanme=zs"></a>

<a href="url/act/add/nanme/zs/age/20"></a>

第三种:AJAX
模拟http协议


服务器接收数据的方法

超全局素组
$_GET
$_POST
$_REQUEST

表单写传送的时候要大写,GET和POST

-------------------------------------------
避免乱码
3码合一

第一,数据库存储编码
第二,编辑器编码
第三,php代码 写好要显示的编码 utf-8

注意:出现乱码是,因为显示的浏览器没有设置好
还有mysql等,命令窗口是GBK编码,所以会乱码,只要告诉显示GBK即可,

 

---------------------------------------
25讲php类型
自动转换
if里面的语句就自动转换为真假


强制转换
(int)$a
(foat)$a
(string)$a
(bool)$a
(array)$a
(object)$a

js中测试数据类型typeof()
php中测试数据类型gettype($V) 返回数据类型


零值会自动转换为假(false),非零值为真(true)
注意:空字符串,和只有一个0的字符串会自动转换为假,其余都为真!,空格也是真
空数组就是假,其它为真!
其它类型
null为假
对象和资源永远为真

------------------------
第26讲 类型相关的函数
变量 处理函数
variable handling函数

gettype()函数 获取类型
学习一个函数,都要搞清楚这个函数的原型
string gettype(mixed var,string type)
返回string 混合类型,8个

settypt()函数 设置类型
bool settypt(mixed var,string type)
返回布尔 混合类型,7个

isset()函数
函数的原型是
bool isset(mixed var)
函数的作用是判断变量是否存在,存在就返回true,否则返回false

变量不存在多大三种情况
1变量未被初始化
2变量被unset掉了
3变量的值为null的时,也认为不存在
另外,isset函数还可以判断一个数组的元素是否存在 以及以后对象的属性是否存在

empty()函数
判断一个变量是否为空!
为空和为假是两个不同的概念!
函数的原型如下:
bool empty(mixed var)

is_type()系列
函数的原型是
bool is_type(mixed var)
有什么数据类型,就有相对应的判断函数


empty() 判断变量是否为空,以及其值是否为false 一般!empty()
isset() 判断一个变量是否为其赋值
is_array() 判断是否为数组
is_string() 判断是否为字符串
is_bool() 判断是否为布尔is_boolean()
is_int() 判断是否为整数
is_float() 判断是否浮点数is_double()
is_numeric()=is_int||is_float
is_scalar() 是否为标量
is_object() 判断是否为对象
is_null() 判断是否为空
is_resource()是否为资源
--------------------------------------------------------
27讲算术运算符
就是用来连接各个常量,变量,函数和表达式参与运算的符号
单目运算符 用来连接的操作数只有一个,比如++ --
双目运算符 用来连接的操作数有两个。+ —
三目运算符 只有一个,条件运算符 ?:

表达式的本质其实是返回一个值,
而语句的本质是执行一条指令


num++ 先使用后自增
++num 先自增后使用
-----------------------
29讲

echo时使用逗号,不是字符串运算符,只是一个简单的分割符。销毁的资源也小
使用。点号,会强制转换为字符串


------------------
30讲
<>这个也是不等于

if(表达式){} 判断的是表达式的值
if($i=0){ 也就是判断最后的值,0!

}

=复制
==等
===严格运算符,先判断
在密码比较中要用这个运算符。

xor异或 是一个为真,一个为假
-----------------------------
短路运算
逻辑与或逻辑或都有一个快捷的短路运算!
&&:如果第一个为false,那么不管后面真假,都不进行判断,或者赋值
如果第一个为true,那么后面进行判断或者赋值。
比如:
$a=100;
isset($a) && $b=10;//第一个为true,所以后面判断,并赋值,所以echo ¥b能出现
echo $b; //如果第一个为false,那么后面就不去判断,所以后面就echo $b错了


||:如果第一个为true,那么不管后面真假,都不进行判断,或者赋值
如果第一个为false,那么后面进行判断或者赋值。
-------------------------------
三目运算符

$i=5>3?$j=7;$k=10;
var_dump($i,$j,$k);

$i=7;
$j=7;
$k短路了,所以没赋值

---------------------------
33讲
位运算符


由于整形数据在内存中占32个bit位(也就是4个字节),而位运算就是专门针对bit位进行运算!,所以,每一次整形数据的位运算都要计算32次!
一个bit位只有0和1两个状态,类似于数据类型中的布尔型,一共有以下几个运算
&按位与,表示两个位都为1时,返回1,否则就是返回0
|按位或,表示两个都为0时,才返回0,否则就是返回1
~按位非,1变成0,0变成1;
^按位异或,如果两个位不同,就返回1,如果两个位相同,就返回0
<<按位左移,将整个字节向左移动,右边用0填充,10011 左移一位,000110
>>按位右移,将整个字节向右移,正数的左边用0填充,负数左边用1填充
----------------------------------------------------
36 流程控制
//条件分支
//条件执行
分支结构
单分支-------------
if
多分支
if
elseif(注意js中的是else if)//如果分开了的话,是else中嵌套了if
范围用if

//状态分支---------
状态用switch
//开关语句
switch(0){
case 0>=90: //注意这种情况的话, 0>=90结果是false,是0, 0和0匹配,这条匹配没错
break;
default:

}

循环结构---------
for(){
}

 

当循环
while(){-----------
}


直到型循环,至少要执行一次!
do{-----------
}while

foreach

循环的中断语句-----------
continue
break
中断层次,默认都是为1, (最好不要超过3层循环,不然效果太低)break 3
注意:中断语句前,一定要有++或--,位置不能犯错,不然又是一个死循环

---------------------------
39,
利用辗转相除法
求最大公约数
大的除小的,如果为0的话,就为最大公约数
如果有余数,那最小数除余数,如果为0的话,就为最大公约数。如果还有余数,,循环,直到为0,最后那个除数就是最大公约数


//求出2数的最大公约数
function mangys($max,$min){
$num=($max%$min);
if($num==0){
echo $min,"<hr/>";
}else{

mangys($min,$num);
}
}
mangys(154,136);


---------------------------
40 for($i=0;$i<n;$i++)
循环n次
表达式1循环1次 表达式2循环n+1次 表达式3循环n次
(表达式2多一次结束)
表达式3 $i++可以放在循环语句中,此时和while循环是一样的


另类for
$i=1;
for(;;){
echo $i;
$i++;
if($i>9){
break;
}
}


----------------------
41,循环的中断语句
break num;
if() break 2;

continue
switch的本质也是一次循环,只不过他只循环一次而已

-------------------
42讲 流程控制语句的替代语法

php代码嵌入到html中的时候,流程控制语句中的左右大括号,可能给人们带来一些视觉上的不友好
(混合编程时),
在php代码嵌入到html代码中的时候,流程控制语句中有左右大括号,可能给人们带来一些视觉上的不友好感,所以,php也支持一种程控制语句的替代语法,基本规则如下:
1,将以前的每个语句最开始和每个子语句的最开始的那个左大括号用冒号:来代替
2,整条语句结束,使用另一种结束标签,用endif,endwhile,endfor,endforeach,并且以分号结束!
while(){}
改为 { 为 : }改为endWhile
while(): endWhile
注意:do-while没有这种结束语句
-------------------------------------

项目流程简介
需求分析----------
了解客户的真实需求是什么?
另外,还往往要进行一次可信性分析!
设计--------------
怎么去做,具体的算法是什么!
编码的实现--------
敲代码,一般有两个方向:
二次开发--
是指一个成熟的产品之上,完成自己特定项目的业务逻辑,
比如:
论坛:discuz,phpwind
cms:内容管理系统,dedecms(织梦),帝国,新云(asp)
社交:ThinkSNS,Ucenter Home
电商:ecshop,ecmall,shopex

基于框架---
zend thinkphp yii ci


----------------------------------------
测试版
在mysql里面创建一个ecshop数据库
create database ecshop;

在配置虚拟机
还有域名

D:\amp\apache\htdocs\ecshop\data
因为老师用过。
inso。not删除
或者直接打开
http://www.ecshop.com/install/index.php

最后选,测试版的

------------------------------------------------------------------
43讲 goto语句
“乱跳语句”,了解即可,不推荐使用!因为容易破坏程序的结构
基本的语法是:
语句1;
标签2:
语句2;
goto标签1;
语句7;
语句8;
标签1:
语句9;
语句10;
goto标签2;
(典型的死循环)
黑客攻击的时候!!!!!!----
----------------------------------------------------------------------
44讲,文件载入
所谓的文件载入,是指将需要的目标文件内的
php中提供了四种文件载入的语句,分别是:
include include_once require require_once
注意:以上的四个语句,主要的功能都是文件载入,只是有些语法上的差别!


如果把载入的文件的后缀名改成html
一点注意:
载入的文件,无论是什么类型,我们需要是目标文件内的代码
所以无论是php文件还是html文件,里面的代码一样会被载入

深度的解析一下载入的过程
1,执行到include的时候,先退出php模式,进入到html模式
2载入目标文件内的源代码
3,将载入的代码,从源代码开始,进行编译并执行

载入路径的路径:----------------
可以分成两种,相对路径,绝对路径------------
相对于当前脚本文件所在的位置的路径地址!
典型的有两个
./当前目录下,就是当前执行脚本所在的当前目录


../上级目录下 注意这个!!--------
典型的,如果被载入的文件里面又包含了其他载入文件,这样,很容易出错

---------------
思考:如果包含文件的时候,文件的前面什么都没有!
此时,是不是默认的和./完全一样呢?
其实是不是的!
如果前面什么都没有,就是不写路径的时候,其实默认的是php的默认路径

习惯,一定要写./ 一定要


phpinfo()
include path 默认的路径就是.
修改ini708行左右window下的
include_path=",;c:\php\includes"
老师的做法是
include_path="d:\amp\apache\htdocs\test\includes"
就是要被引入的东西都放在一个文件夹
在真是项目中,可以直接把前面的点去掉,自动找

---------------------
绝对路径
当出现多重载入的时候,比如上面的载入文件
效率最高


但是当项目移动时---------------------
又改变了,所以又要改
如何解决
//默认路径,可以自己配置
//include 'test.php';


//相对路径,
//include './test.php';


//绝对路径, 自己配置终极版本
//include DIR_VIEW.'test.php';*/

注意:require ,必须载入,如果目标文件不存在,则载入失败后,报告一个error级别的错误,
当前脚本继续执行

有时候,只载入一次的判断是有必要的。前面已经被载入了,所以这里就不在继续载入了!
----------------------
45讲 脚本的执行控制
终止脚本的
die,exit 没区别,一个功能的两个名字(互为别名)
当执行die时,当前脚本停止;
并可以带一句话输出die('');exit('')


脚本延迟执行
sleep(秒)
sleep注意是用在代码的测试
-----------------------------------
46讲,函数初步
函数定义
function 函数名(参数列表){
函数体
}
写代码的时候可以先调用函数在写函数体,因为在执行之前
已经在执行时,已经把源代码编译好了

 

函数名
首先,不区分大小写,一般就用小驼峰法(以后类名用大驼峰法),类名是不可以重复的


可变函数-------

指 函数名可以用一个变量来保存
function maxs(){}
$funct_max='maxs';
maxs()就变成了
$function_max();


就是名字能用变量保存
可变函数常用于一组功能类似,而且函数名也相似的情况
比如:以后学习php处理图片的时候,需要利用图片创建
//创建画布的函数
imagecreatefromjpeg()//就是名字起的差不多,可以把相同的取出来,不同的用变量拼接一起

匿名函数
php也允许定义一个没有名字的函数,称为匿名函数,
匿名函数是一个对象类型的数据

匿名函数是closure类的一个实例,Closure就是闭包的含义,因此,匿名函数也叫闭包函数!
如何调用这个闭包函数
把它赋给一个变量,然后
变量名(函数的参数)

----------------------------------------
47函数的参数
函数为什么要有参数?
函数是相对独立的代码区,但不是绝对独立,也就是说,函数对外应该有一个接口以实现
相关数据的传递,这个接口一般就是用参数来实现的!
函数的参数可以分成两种:
形参和实参
形参(parameter)
实参()是在调用该函数的时候,把实际的值传递给该函数,这个时候,形参才有真正的数据
思考,实参能不能由一个变量来充当?
答案是可以的,那么在调用的时候,就变成了实参变量传递给形参变量


默认就是值传递,在函数内,如果修改形参变量的值,不会影响到实参的值!

刀了$
安得&


引用传递 引用函数的地址
function sayHi(&$n){
$n='佐助';
ehco $n;
}
如果形参采用的是引用传递的话,那么实参采用的只能是变量

 


形参的默认值
常规的形参的值应该来源于实参的传递!
但是,如果某些参数的值有比较常用的情况,可以为该形参设置一个默认值,
那么函数在调用的时候,如果传递了相应的实参,就调用相应的实参,不然的话,就
调用默认值
function exam($score,$pass_score=60){}
注意:
1,如果一个函数有多个形参,有的有默认值,有的没有默认值,应该把有默认值的形参写在最后面
2,参数的默认值,应该是一个确定的数据,比如一个确定值或者常量


参数的数量问题----------------
一般来说,实参和形参的数量应该是相等,一一对应
实参多于形参,程序可以正常的运行,多的实参直接舍弃掉了
实参少于形参,只有一种正常的情况,就是形参列表中的最后有默认值的形参变量!有默认值的形参可以不用


不定参数的函数------------------
思考:如何定义这类函数的参数呢

典型的,就是一个参数都不定义
但是,此时,就必须要考虑如何才能获得当前实际参数的值!

是利用php的一个内置系统函数来获得的!
func_get_args()
这个函数的功能是:获得当前函数多得到的实际参数的数据,并以数组的方式存在

func_get_arg()获得某个参数的值,并且使用参数的索引位置是从0开始的
func_num_args()获得实际参数的数量!

------------------------------------
48讲。函数体
就是可执行性的代码集合,以完成相应的功能!
其中一条的return语句比较重要!
函数中的return语句
作用:
1,将函数的返回结果,返回给调用该函数的位置!
2,停止该函数的运行!
注意:每个函数只能有一个返回值,但是可以有多个return语句


思考:如果一个函数确实有很多值要返回
------------------------------------------------
第49讲,变量的作用域

所谓的变量的作用域,是指一个变量在定义之后再哪里可以使用,在哪里不能使用的问题
也就是一个变量的有效作用范围!
在php中,一共支持两个作用域:
局部作用域和全局作用域
局部作用域:在一个函数内部定义的变量,就是局部!
全局作用域:在函数外部定义的变量,就是全局!

注意:
1,在php中,全局和局部作用域是不能重叠的!,也就是相互之间不能访问,井水不犯河水

//嵌套函数-------------
function f1(){
$v1=' var f1()';
echo $v1;
function f3(){
$v3=' var f3()';
echo $v3;
}
}
//要调用f3()时,要先调用f1()
f1();
f3();//f3在f1里面,所以要先调用f1();


超全局变量----------------------------------------
也是作用域的概念,但却是永恒不能直接定义的作用域!
所谓的超全局变量,有点类似js中的全局变量,就是在全局和局部都可以使用的变量
在php中,所有的超全局变量都是系统预定义变量,也就是前面讲过的九大超全局数组变量

九大:指的是个数为9个
超全局:指的作用域
数组:指的该变量的数据变量
再次前调:用户不能创建超全局变量!

解决方法-----------------
一个包含了全部变量的全局组合 数组 。变量的名字就是数组的键。

预定义变量$GLOBALS就是专业将用户的数据超全局化的
1,$GLOBALS数组的每一个元素,都与当前的每一个全局变量是一一对应的!
也就是说,每当用户创建一个全局变量,就会自动的在$GLOBALS里面增加一个元素


$GLOBALS['g1']="自来也";
echo $g1;

$g1和 $GLOBALS['g1']是同生共死的
2,反之,每当增加一个$GLOBALS,就会自动创建一个全局变量
3,此时全局变量和$GLOBALS的关系并不是引用传值的关系,而是比引用传值更加亲密的关系
因为他们是同生共死的

关键字global---------
在php中还引用了一个关键字
注意:此时的global的作用并不是把
1,定义了一个局部变量,该变量的名字和外面的全局变量名字是一样的!
2,将外面的全局变量的地址的复制一份,然后赋值给上面的地址
(记得是复制一份,副本2)
global $g1 这个等于下面
$g1= & $GLOBALS['g1'];


global可以理解为复制一份副本
而 $GLOBALS['g1']不同,他们是同生共死的
实际项目中$GLOBALS比较多
------------------------------------------------
50讲,变量的生命周期
指变量什么时候出现,然后什么时候消失!
作用域是指变量在哪里可以使用,也就是变量的有效范围!
1,php所有的资源(包括变量),都会在一个脚本周期结束时消失
2,变量被unset之后也会消失!

局部变量的生命周期是,函数调用的时候开始,函数执行结束时,结束
全部变量的生命周期是,脚本开始的时候开始,脚本结束的时候才结束
答案:使用静态变量!静态局部变量
所谓的静态局部变量,是指不随着函数执行的结束而结束,而是,只要函数存在
,该变量就一直存在!
这个时候,需要static关键字将一个普通的局部变量,声明为一个静态变量

特点:每次调用后,该函数的静态变量的值都会被保存下来,而不会消失
声明后,这个函数调用时,生命开始,然后直到脚本结束才结束

注意:无论有没有static关键字,函数的外部一样都不能使用,它的作用是,将局部变量!!记得是局部变量
------------------------------------------
51讲,函数的递归调用
递归的含义
递归其实也是一种算法上的描述,不是一种新的语法!
有时候,我们解决问题的时候,会遇到这种情况,当我们把一个大的问题
按照某种解决方案,分成若干个小的问题的时候,发现这些小问题的解决方案
其实和刚刚大问题的解决方案是一样的

典型的,比如阶乘!
10!=10*9*8*7...*1
10!=10*9
9!=9*8
8!=8*7
语法上,函数的递归调用,就是函数在执行的过程中又调用自己!
案例:斐波那契数列-------
斐波那契数列:前两项已知,从第三项开始,每一项都是前两项之和!
1 1 2 3 5 8 13 21

1(n<2)
f(n){
f(n-1)+f(n-2) (n>=3)
递归的两个要点:
1,递归的出口,就是指什么时候停止递归调用
2,递归点,就是指什么时候开始使用递归调用

递归,代码书写比较简单,但是执行的时候,比较消耗内存资源!
但是本质上是以空间换区时间!

--------------------------
52讲 string函数


strlen获取字符串的长度,,字节的长度
substr截取字符串的长度。应该有3个参数
从指定字符串的指定起始位置开始,截取指定长度的字符串!
通过下标获取字符串里面的某个字符
strtolower把字符串全部变成小写
strtoupper把字符串全部变成大写
ucfirst 首字母大写;
lcfirst 首字母小写
strrev 把字符串反转
strpos 查找并返回字符串某个字符的起始位置
应该有2个参数
strrpos 从右往左查找字符串某个字符的起始位置
strchr 也是字符串截取函数,截取指定位置开始以后的全部字符串!
还有一个别名strstr

strrchr 也是字符串截取函数,从右往左,截取指定位置开始以后的全部字符串
trim 去除字符串的左右的空格!

;
注意:中文会乱码的的原因就是因为,它占3字节
字符串的起始位置一直是从左往右算的,而且是从0开始


----------------------------------------
53讲 时间函数

time 返回一个时间戳,1970年的1月1号。格林威治时间到现在的秒数(和js不一样)
date 使用格式占位符将时间戳指定为对应格式的形式!时间占位符有很多,常见的有6个:
Y 年
m 月
d 日
H 时
i 分
s 秒
基本的语法格式是:
date(时间占位符和一些普通字符,时间戳)
其中时间戳可以省略,默认就是当前时间
var_dump(date('今天是Y年m月d日,现在的时间是H:i:s'))
var_dump(date('今天是Y年m月d日,现在的时间是H:i:s',123123123) )

strtotime()
将英文格式下的时间字符转换成时间戳
var_dump(strtotime('tomorrow'));
var_dump(strtotime('next week'));
var_dump(strtotime('next month'));
var_dump(strtotime('next '));
microtime();得到一个微妙基本的时间戳

--------------------------------------------
54讲 数学函数
abs(-8 绝对值
floor(7.78) 7向下取整
ceil(7.78) 8向上取整,得到一个比当前数值大的最小整数
round(7.78,1) 7.8四舍五入
rand和mt_rand() 都是获得一个指定区间的随机数。
mt_rand()效果更高
--------------------------------------------------
55讲 数组初步
数组是一种复合类型,就是在内存里面开辟一块连续的内存空间(堆空间)
里面可以保存多个不同类型的数据,而且没有长度限制!

数组 是由元素组成的,每个元素都是数组的成员!
元素的名字,也叫做键,将叫做下标
元素的值,也称为值
所以,一个元素也称之为是一个“键值对(key/value)”

创建数组
一般有两种方式:-----
显示的创建
array('name'=>'佐助')

隐式创建
$arr['name']='佐助';


强制转换(arry)
$i=10;
$arr=(arry)$i;

var_dump($arr);


访问素组------
$arr2['name']

声明时
$arrA= array(10,20,30);
$arrA= [10,20,30];

索引数组 也是数字数组 索引01234567.....
关联数组 $arrA=array('name'=>'zs','age'=>20);
混合数组 混合着用前2个数组

索引数组 -----------------
1,当一个数组的下标全部省略的时候,系统会自动的分配
2,当省略掉其中的部分下标时,系统会自动分配时,会是前面最大整数+1
如果没有的话,会从0开始
3,数组的下标只能是整形和字符串型,虽然语法上允许写其他类型,但是
在创建数组的时候会转成相应的字符串型
4,如果两个元素的下标是一样的话,后面的会覆盖前面的

 

纯数字的字符串在数组中也当做一个数组型
小标可以是负数,但是也要是整数
如果是浮点数的话,4.6 4.8 4.9都是4,最后一个会覆盖掉

关联数组------------------
1.典型的,就是以字符串为下标,这里的字符串可以表示一定的含义
2,并不是说,整形下标的数组就一定是索引数组,也有可能是关联数组,比如一个学生的
学号与姓名之间,就是关联数组!
关键是看元素的下标与值之间是否有一定的关系!
另外,还可以按照数组的维度、
一维数组

多维数组
其实,严格意义上来说
//foreach基本语法
foreach(数组名 as 键变量=》值变量){
循环体(也就是对键和值的相关操作)
}

--------------------------------------
56讲,数组的foreach遍历
先得到元素,在得到下标

遍历第一种
foreach(数组名 as 变量){
echo 变量."<br/>";
}
foreach($arrA as $v)


遍历第二种
foreach(数组名 as 变量1=>变量2){
echo 变量1.":".变量2."<br/>";
}
foreach($arrA as $k=>$v)
1,foreach遍历的是对原数组的拷贝,和原数组的值的关系是值传递,所以
在遍历的时候如果进行修改,不会影响原数组的变化!
2,$value与原数组之间也可以是引用关系,就是在遍历的时候在$value的前面加上&即可
3,只能是数组的值变量才支持引用传递,键变量不支持

 

注意:for循环的话,只能for出索引数组
然而,下标是属于元素的一部分,我们一定是先有元素才有下标!
所以,上面的for遍历不是真正意义上的遍历!
foreach可以直接遍历的本质原因是数组的指针!
-----------------
57讲,数组的指针
其实,在每个数组内,都存在一个数组的指针,看不见摸不着,这个指针
就是指向某个数组的某个元素!

1键key($array)

2值current($array)

3移动指针next($array)下移指针

思考,如何利用上面的几个函数来实现for循环


for($i=0,$num=count($array);$i<$num;$i++){
echo key($array),current($array),'<br/>';
next($array);
}


所以在进入for循环之前要对数组的指针进行初始化!
这个工作是有另外一个函数来完成的
4,reset($array); 将数组的指针进行重置(也就是初始化)

--------------------------------------

项目的引入

web架构的基本思想
web的架构思想是指:当一个网站的功能越来越多的时候,项目中的代码应该怎么去管理
显示和逻辑想分离
其中:html主要负责展示的功能,其中的可变数据是由动态的脚本PHP来填充,这样的一种
混编的文件一般称之为 模板文件!
模板文件中的php代码


<?php while(条件):?>

<?php endWhile; ?>
模板文件是不能给用户看的
php主要负责业务逻辑处理!
一般要求浏览器请求负责逻辑处理的php文件,然后再php中显示
在模板里面写.htaccess 里面禁止访问,要访问,在外面的
index。php里面引入 include './index.html'


这样就浏览器不能访问了
要访问只能通过那个单一入口的加载


1更好的管理代码,显示和逻辑分别管理!
2代码的重用更加的容易,提高工作效率!


功能1,
首页:购物车数据,商品分类数据,其他的首页需要的数据
功能2,
拍卖活动:购物车数据,商品分类数据

大家有什么启示?
很多功能都是由一些相对独立的数据处理模块而组成的
这样就产生了另外一种web架构的思想:mvc

显示view视图
html+css+js

辣椒
番茄
土豆
鸡蛋
肉丝
功能调度 controller控制器(相当于指挥)
番茄炒蛋等各种组合
php+mysql 逻辑{
数据处理Mode 模型
就是准备这些原材料


所谓的mvc思想就是在显示与逻辑相分离的基础之上。再把逻辑中的所有的逻辑处理模块提取处理
在需要的功能上进行调度即可!
m:Model,模型,项目中的数据处理单元 厨师
v:view,视图,项目中用于展示数据的单元(模板)服务员
c:controller,控制器,项目中负责某个功能整体流程调度的单元!
浏览器只要和c进行交互,m和v和被c控制,并且模型m和v之间不存在任何的交互

 

-----------------------
58讲
reset($array) 重置

end($array)结束

---------------------------------
59讲while-each-list遍历
while还有一个功能非常强大的函数,就是each函数,语法很简单:
each(数组名)
它的作用是:同时具备了key,current,net函数的功能!
既可以获得当前元素的信息,又可以将指针下移!
echo函数的返回值:
把原数组当前元素的键和值当成是另外一个数组元素的值,重新创建一个
新的数组
两个值分别创建了索引下标和关联下标:
其中关联的:key表示原数组当前元素的键,value表示的是当前元素的值‘
0表示的是键,1表示的是值
所以,$each[0] $each['key']都代表当前原数组的键
var_dump($each[0]);
var_dump($each['key']);


var_dump($each[1]);
var_dump($each['value']);
利用循环语句while语句配合,each的遍历

//只要我的指针为真就继续,只要指针为假就出去
while($each=each($arr1)){
var_dump($each['key']),$each['value']);
each '<br />';
}


和foreach的区别是:
1,还在需要在必要的时候对数组进行初始化
2,不能直接在循环体内
所以,通常还配合list函数!
list函数也是一个系统函数,
前3个值赋予ar,赋值的时候只认索引数组
list($v1,$v2,$v3)=$arr;
//有必要的时候才在循环之前重置一下数组的指针
reset($arr1);
while(list($key,$value)=each($arr1)){
var_dump($key,$value),
echo '<br />';
}

---------------------------------------------
第60讲 常用的数组函数
count函数 统计数组的个数
count($arr1,true);递归统计,会把多维数组里面的数组个数也加上
默认是false和0;
range建立一个
range(2,17,2)从索引2,到索引17,以步长2的
range('a','g',2);从下标a,,到下标g,以步长2的
range('A','Z');
array_merge(range('A','Z'),range('a','z'));

关联下标,如果是非数值型下标,如果有重复,后面的会覆盖前面的!
如果是索引下标的话,不会冲突,索引重新从0开始重新索引!重置了
array_rand 随机抽取数组内的几个元素的键,
返回的是一个素组,里面的值是原来的键
使用这个函数随机抽取下标值的时候,是按照前后的顺序来抽取的
有时候,为了体现随机性,可以将原数组打乱!
如果只取一个的时候,就是取其值,不是下标了

shuffle函数
本函数是打乱(随机排列单元的顺序)一个数组
注意:作用是将一个数组打乱,shuffle里面的参数是引用传递,说明,不仅讲原来的数组打乱
键名变成索引了。

-----------------------
第61讲。制作验证码
写算法
//1,先用array_merge和range函数拼凑出一个数组(包含大小写字母和数字)
//2在用shuffle打乱该数组
//3使用array_rand函数随机取得若干该数组的下标
//4根据获得的下标遍历获得相应的数组的值,拼凑出一个字符串
//5输出


--------------------------------
第62讲
常用的数组函数
max和min
支持获得数组内的最大值和最小值!

array_keys取得所有元素的键,并返回一个索引数组,有时一个数组的键
比较有意义,需要单独的取出来操作,返回一个索引数组
$key=array_keys($arr1);
var_dump($keys);
array_values
取得所有元素的值,也返回一个索引数组

array_combine结合
返回一个数组。有两个参数都是数组
用第一个素组的值作为建,用第二个数组的值作为值,重新组合
新数组=arra_combine(健数组,值)
var_dump(array_combine($keys,$values));
array_flip($arr) 快速的反转
作用:交换数组的键和值
in_array
判断一个数组内是否存在某个元素的值!
第一个参数是某个值,第二个参数是一个数组名
第三个参数的缺省值为false,如果为true。则需要判断找到的值与指定的类型一样,也称之为“严格查找”

in_array('卡卡西',$arry1)判断bool
arry_key_exists //判断一个数组内的某个元素的键是否存在
a
rray_search
搜索数组内的某个数组的值,并返回其下标!
返回值可能有三种:
int型
string型
false型(没找到)

一共有3个参数
第一个:搜索的值
第二个:在那个数组内搜索
第三个:是否需要匹配类型的搜索。默认为false

array_chunk
将一个数组分割成多个数组,其中每个数组的单元数量由第二个参数size决定
implode,利用一个分隔符连接成一个字符串
很少这样做,因为一旦相连,就很难分开!
有两个参数
第一个:指定的分隔符
第二个:指定的数组
explode
将一个字符串,利用其中的分隔符。将其炸开称为数组
注意:在分割的时候,保证分隔符在字符串数据中是唯一的!
比如:

extract

将数组的每一个元素都变成变量,其中变量的名字就是数组的下标值,变量的值就是数组的值


常见的:将一些数据先放到一个数组内,然后将整个数组当成是一个函数的实参传递形参,
然后这个函数内使用extract,

compact利用多个变量,形成一个数组!自然,变量的名字就是数组元素的键。
compact('length','width')只写变量名,不用写$符号
--------------------------
63讲
回调函数
对数组的每一个函数都要进行运算
所谓的回调函数callback,callable,就是指用户自己定义的个函数(也可以是系统函数)
然后由php负责调用,或者用户自己手动的调用
array_map就是把目标数组的每一个元素的值(只能获取元素的值),依次当做指定函数的
实参进行函数的调用,并返回相应的值,并返回一个新的素组
某些地方可以代替for循环
如何让一个数组的元素的值全部加倍
$arr1=array(1,2,3,4,5,6,7,8);

function X2($num){
return 2*$num;
}
$arr3=array_map('X2',$arr1); //有点像定时器,第一个是
函数
var_dump($arr3);
对数组的每一个函数,都调用某个函数并返回!


可以同时对多个数组进行回调!
并且每次都会对不同数组的同一个位置元素进行一次操作,也就是说,每一次调用,
array_map('max',$arr1,$arr2,$arr3);
一次遍历N个数组
------------------------------------值--------------
64讲,模拟数据结构
数据结构:数据在内存中的存储的处理方式,往往是通过数字模型建立


php没有数据结构的说话,但是模拟数据结构
栈:先进后出,后进先出! 比如:洗碗
队列:先进先出,后进后出 比如:排队
栈模拟
入栈:
array push:将一个或多个数据压入数组的末尾
出栈:
array_pop:将一个数据出栈,后进的先出


另外:我们也可以从数组的前面模拟栈
array_unshift:从数组的前面加入数据
array_shift:从数组的前面弹出数据
每次出栈和入栈,都要重新排序索引


模拟队列
array_unshift: -》 array_pop:
array push: -》array_shift:
---------------
65讲。排序函数
sort
对数组元素的值进行升序排序,也就是从低到高
排序后,会重新排成一个索引数组,也就是键值不再关联!
asort 跟sort是一样的,也是升序排序,只是排序后保留键值
关联

rsost 降序,从高到低
arsost 跟rsost一样,只有保留排序后的键值关联
-----------------------------------
66讲:冒泡排序
是一种算法
基本的算法思想:
依次的比较相邻的两个元素,相除逆序(逆序是数学上的概念,是成对出现的,比如50,30就是一对逆序,,消除逆序,就是大的
放在后面,小的放在前面)

这样,一轮比较下来,最大的那个数一定是在最后面
然而,再继续新的一轮的比较,


是一个双重循环
外层控制伦数,内层控制每轮比较的次数!

 

 

-------------------
调试函数
exit 终止脚本执行,不在执行其后代码,人为故意的程序终止,不输出提示
exit("提示信息") 终止脚本执行,不在执行其后代码,人为故意的程序终止,输出提示

die 终止脚本执行,不在执行其后代码,不输出提示
die("提示信息") 终止脚本执行,不在执行其后代码,输出提示


or die("无法打开文件")

 


--------------------------
作用域

一,内部
二,外部
三 全局作用域
global 关键字
一般用于函数内部使用

static变量
静态变量
1,只被初始化一次
2,不会随函数的调用与结束而消失,不能被外部访问
再次调用时,仍然可以使用,以上次运行完的值
3,只能赋予字符值或数值,不能是一个表达式
4,当在多次调用时,仍然保留某一变量的值,可以使用静态变量,全局变量也可以实现


------------------------
php中的字符串函数

string函数

sleep()睡眠
strlen获取字符串的长度,,字节的长度
substr截取字符串的长度。应该有3个参数
从指定字符串的指定起始位置开始,截取指定长度的字符串!
通过下标获取字符串里面的某个字符
strtolower把字符串全部变成小写
strtoupper把字符串全部变成大写
ucfirst 首字母大写;
lcfirst 首字母小写
strrev 把字符串反转
strpos 查找并返回字符串某个字符的起始位置
应该有2个参数
strrpos 从右往左查找字符串某个字符的起始位置
strchr 也是字符串截取函数,截取指定位置开始以后的全部字符串!
还有一个别名strstr

strrchr 也是字符串截取函数,从右往左,截取指定位置开始以后的全部字符串
trim 去除字符串的左右的空格!

;
注意:中文会乱码的的原因就是因为,它占3字节
字符串的起始位置一直是从左往右算的,而且是从0开始


----------------------------------------
53讲 时间函数

time 返回一个时间戳,1970年的1月1号。格林威治时间到现在的秒数(和js不一样)
date 使用格式占位符将时间戳指定为对应格式的形式!时间占位符有很多,常见的有6个:
Y 年
m 月
d 日
H 时
i 分
s 秒
基本的语法格式是:
date(时间占位符和一些普通字符,时间戳)
其中时间戳可以省略,默认就是当前时间
var_dump(date('今天是Y年m月d日,现在的时间是H:i:s'))
var_dump(date('今天是Y年m月d日,现在的时间是H:i:s',123123123) )

strtotime()
将英文格式下的时间字符转换成时间戳
var_dump(strtotime('tomorrow'));
var_dump(strtotime('next week'));
var_dump(strtotime('next month'));
var_dump(strtotime('next '));
microtime();得到一个微妙基本的时间戳

--------------------------------------------
54讲 数学函数
abs(-8 绝对值
floor(7.78) 7向下取整
ceil(7.78) 8向上取整,得到一个比当前数值大的最小整数
round(7.78,1) 7.8四舍五入
rand和mt_rand() 都是获得一个指定区间的随机数。
mt_rand()效果更高

---------------
session_start();
$_SESSION['USER_id']=$data[0]['id'];
$_SESSION['USER_username']=$data[0]['username'];
1、每个页面都必须开启session_start()后才能在每个页面里面使用session。
2、session_start()初始化session,第一次访问会生成一个唯一会话ID保存在客户端(是基于cookie保存的),用户下次访问时,session_start()会检查有没有会话ID,如果有浏览器会带着这个会话ID过来(通过发送头文件传过来的,这个可以用ff浏览器看到)来确定客户端。
3、给于cookie的session会在客户端保存一个会话ID即session_id,这个可以通过打印cookie看到,这个session_id的键值为session_name,
session_id() == $_COOKIE[session_name()]
4、如果客户端禁用了cookie,则必须用url传递session_id即给予URL的SESSION
5、注销SESSION时不能用unset($_SESSION),可以使用$_SESSION = array()或则$_SESSION = null,正确注销session的方法如下:
//正确的注销session方法:
//1开启session
session_start();
//2、清空session信息
$_SESSION = array();//注销SESSION时不能用unset($_SESSION),可以使用$_SESSION = array()或则$_SESSION = null
//3、清楚客户端sessionid
if(isset($_COOKIE[session_name()]))
{
setCookie(session_name(),'',time()-3600,'/');
}
//4、彻底销毁session
session_destroy();

 

----------------
cookie
setCookie('USER_id','',time()-1);
setCookie('USER_username','',time()-1);
setcookie('id',$data[0]['id'],time()+3600*24*7);
setcookie('username',$data[0]['username'],time()+3600*24*7);

//清除
setCookie('USER_id','',time()-1,'/');
--------------
die()和exit()的区别
有这种说法一个是完全卸载出内存,一个是退出但不卸载出内存…
die();短时间是用不着了,die()常用于脚本尾部
return也是可以终止当前函数,但是要返回一个值
exit()可能还会被调回使用,exit()常用于类和函数里面,。输出一个消息并且退出当前脚本

exit()在函数或者方法里面使用;它会返回一个。die在代码片段使用,直接终止。
-------------------------
require 无论几个,都只解析一次,错误会报错,终止 相对效率高
require 一般开头使用

include 有几个就解析几次,报警告,然后报警告,后续继续执行
require_once() 先判断之前有没导入
include_once() 先判断之前有没导入

===========

<?php

文件上传--------------------------------------------

<form method="POST" action="5upload.php" enctype="multipart/form-data">

<input type="file" name="image1" />
<input type="submit" value="提交" />
</form>

-------


header('content-type:text/html;charset=utf-8');
echo '<pre>';
/*var_dump($_FILES);
sleep(5);*/
//验证系统错误
switch ($_FILES['image1']['error']) {
case 1:
echo '上传错误,超出服务器规定文件大小!';die;
case 2:
echo '上传错误,超出表单规定文件大小!';die;
case 3:
echo '上传错误,文件上传不完整!';die;
case 4:
echo '上传错误,请先选择要上传的文件!';die;
case 6:
case 7:
echo '对不起,服务器繁忙,请稍后再试!';die;
}
//验证逻辑错误
//验证上传的文件的类型
//先把允许的文件类型放到一个数组里面
$allow = array('image/jpeg','image/jpg','image/png','image/gif','image/bmp');
if(!in_array($_FILES['image1']['type'],$allow)){
echo '非法的文件类型,允许的类型有:'.implode(',',$allow);
die;
}
//移动文件
$target = 'uploads/'.$_FILES['image1']['name'];
if(move_uploaded_file($_FILES['image1']['tmp_name'],$target)){
echo '上传成功!';
}

---------------------------------
//分页
//定义当前的页码数,默认为1
$pagenum=isset($_GET['num'])?$_GET['num']:1;
//定义每一页显示的记录数
$rowsPerPage=5;
//计算总页数
//先查询一共有多少条记录
$sql="select count(*) from reply where rep_pub_id='$id'";
$result=mysql_query($sql);
$rows=mysql_fetch_row($result);
//获取所有的记录数
$rowCount=$rows[0];

 

//计算总页数
$pages=ceiL($rowCount/$rowsPerPage);


//设置分页初始值的startNum的值,也就是第一个值-----------------------
if($pagenum<=3){
$startNum=1;
}else{
$startNum=$pagenum-2;
}

//确定分页初始值的startNum最大值
if($startNum>=$pages-4){
$startNum=$pages-4;
}


if($startNum<1){
$startNum=1;
}
//确定最后一页的值
$endNum=$startNum+4;
if($endNum>$pages){
$endNum=$pages;
}


//确定上一页的页码
$preNum=($pagenum>=2?$pagenum-1:1);
//确定下一页的页码
$nextNum=($pagenum==$pages?$pages:$pagenum+1);

 

//定义一个空字符串
$strPage='';
//首页
$strPage.="<a href='./show.php?id=$id&act=reply&num=1'>首页</a>";
//拼凑上一页
$strPage.="<a href='./show.php?id=$id&act=reply&num=$preNum'>上一页</a>";

//拼凑出中间的页码
for($i=$startNum;$i<=$endNum;$i++){
$strPage.="<a href='./show.php?id=$id&act=reply&num=$i'>$i</a>";

}

//下一页
$strPage.="<a href='./show.php?id=$id&act=reply&num=$nextNum'>下一页</a>";

//尾页
$strPage.="<a href='./show.php?id=$id&act=reply&num=$pages'>尾页</a>";

//输出总页数
$strPage .="总页数:$pages";

 

 

 

----------------------------------------------
<?php echo date('Y-m-d H:i:s',$row['time']); ?>

--------------------------------------------
判断从哪里传过来的页面,可以在地址家加多一个标识
url?id=''act='';

-------------------------------------------------
接收判断
if(isset($_POST['title'])){//判断变量是否设置
//发帖内容。
$title=strip_tags($_POST['title']);
$content=strip_tags($_POST['content']);//排除脚本语言
trim(str)//两边去空格

 


文件下载-------------------
<?php
header('Content-type:application/octet-stream');
header('Content-disposition:attachment;filename=abc.txt');
echo file_get_contents('./abc.txt');
-------
<a href="./a.itcast">点击</a>

 

----------------------
/**
*用来判断mysql_query()执行的结果
*@param resource|bool $res
*@return mixed
*/
function aql_error($res){
if(!$res){
//给出提示信息
echo '数据库的连接失败!<br/>';
echo '错误编码',mysql_errno(),'<br//>';
echo '错误信息',mysql_error(),'<br//>';
//终止//看个人需要
die();
}
//
return $res;
}

连接数据库"三部曲"脚本------------------------------

/**
*用来执行sql语句并判断是否出错
*@param string $sql
*@return mixed
*/

function my_query($sql){
$res=mysql_query($sql);

if(!$res){
//给出提示信息
echo 'SQL语句执行失败!<br/>';
echo '错误编码',mysql_errno(),'<br//>';
echo '错误信息',mysql_error(),'<br//>';
//终止//看个人需要
die();
}
//
return $res;
}

function my_database($db){
$sql="use $db";
my_query($sql);
}

function my_charset($charset){
$sql="set names $charset";
my_query($sql);
}

 


-----------------
//利用魔术常量
//echo __DIR__;
//把斜杠改为反斜杠,转义
define('DIR_ROOT',str_replace('\\','/',__DIR__));
//定义view目录常量
define('DIR_VIEW',DIR_ROOT.'/view/');
//定义model;目录常量
define('DIR_MODEL',DIR_ROOT.'/model/');
//include DIR_VIEW.'test.php';

include DIR_VIEW.'index.html';

------------------------

//有必要的时候才在循环之前重置一下数组的指针
reset($arr1);
while(list($key,$value)=each($arr1)){
var_dump($key,$value),
echo '<br />';
}

----------------

回调函数array_map


某种程度可以代替for循环
$arr1=array(1,2,3,4,5,6,7,8);

function X2($num){
return 2*$num;
}
$arr3=array_map('X2',$arr1); //有点像定时器,第一个是函数
var_dump($arr3);
-----------------------
冒泡排序
function maopao($arr){
for($i=1,$len=count($arr);$i<$len;$i++){
for($k=0;$k<$len-$i;$k++){
if($arr[$k]>$arr[$k+1]){
$tem=$arr[$k];
$arr[$k]=$arr[$k+1];
$arr[$k+1]=$tem;
}
}
}
return $arr;
}

$arr1=[3,4,1,9,2,0,3,8];
var_dump(maopao($arr1));

//最佳方法
list($a,$b)=arryay($b,$a);
--------------------
验证码
//1,先用array_merge和range函数拼凑出一个数组(包含大小写字母和数字)
//2在用shuffle打乱该数组
//3使用array_rand函数随机取得若干该数组的下标
//4根据获得的下标遍历获得相应的数组的值,拼凑出一个字符串
//5输出

//如果要相同的话,就加多一个相同的range('A','Z')
$arr=array_merge(range('A','Z'),range('a','z'),range(0, 9));

shuffle($arr);
$rand_keys=array_rand($arr,4);//这个的值其实是原数组的下标,随机取4个
$str='';
foreach($rand_keys as $value){
$str .=$arr[$value];

}
echo $str;
------------------
//求出两个数的最大公约数
function mangys($max,$min){
$num=($max%$min);
if($num==0){
//最后输出
echo $min;
}else{
//不断调用自己
mangys($min,$num);
}
}
//例如
mangys(1542,1300);
----------------
//老师的版本
//先比较两个数的大小,较大者除以较小者
/*echo "<hr/>";
$num1=100;
$num2=2320;

if ($num1>$num2) {
$num=$num1;
$div=$num2;
}else{
$num=$num2;
$div=$num1;
}
//求余数$mod=$num%$div
//刚才的除数就变成了被除数$num=$div
//刚才的余数就变成了除数$div=$mod
//可以不比较大小,应该小的数除以大的数,最后的余数也会一样,变回来了
//64/48 余数是16 48/64 余数是48,因为48除64除不动
do{
$mod=$num%$div;
$num=$div;
$div=$mod;
}while($mod!=0);
echo '最大公约数是',$num;*/
//可以代替递归了的调用自己。
//这个可以代替我思维的递归,省效率,
//这个一定要想好
------------------------------------------------------------------------------------
//我国现代数教家张丘建正在《算经》一书中曾提出过有名的“百钱购百鸡”题目。
//该题目论述以下:
//鸡翁一,钱五;鸡母一,钱三;鸡雏三,钱一; 百钱购百鸡,则翁,母,雏各多少?]
//鸡翁最多100/5=20,鸡母100/3=33只。鸡仔100/0.33=300只

/*15x+9y+z=300 一
x+y+z=100 二
7x+4y=100; 一减去二,得出的*/


/*for($x=0; $x <=20; $x++){
$y=(100-7*$x)/4;
$z=100-$x-$y;
if(5*$x+3*$y+$z/3===100&&$x+$y+$z===100&&$y>=0&&$z>=0){
printf("鸡公%d只,鸡母%d只,鸡子%d只<br/>",$x,$y,$z);

}
}*/
------------
//注意,老师的是
/*$x=0;
while ($x<=14) {
$y=(100-7*$x)/4;
$z=100-$x-$y;
if(gettype($y)=='integer'&&gettype($z)=='integer'){
printf("鸡公%d只,鸡母%d只,鸡子%d只<br/>",$x,$y,$z);
}
$x++;
}*/
-------------------------------------------------------------------------------------

/*(典型的死循环)
goto语句
“乱跳语句”,了解即可,不推荐使用!因为容易破坏程序的结构
黑客攻击的时候!!!!!!----*/
/*echo 'A';
beforeB:
echo 'B';
goto afterD;
echo 'C';
echo 'D';
afterD:
echo 'E';
echo 'F';
echo 'G';
goto beforeB;*/

----------------------------

 

//函数的递归调用
/**
*斐波那契数列
* @oaram int $n 数列的项数
* @return int $s 数列的最后一项的值
*/

/*function f($n){
//一定要先写递归的出口
if($n==1||$n==2){
return 1;
}
//递归开始,求前两项之和
$s=f($n-1)+f($n-2);
return $s;
}

 

echo f(6);*/
//echo f($_GET['n']);


//求n的阶层
//---------------------
/*function f($n){
//一定要先写递归的出口
if($n==1){
return 1;
}
//递归点,递归开始
//递归开始,求前两项之和
return $n*f($n-1);
}

echo f($_GET['n']);

*/

 

posted @ 2017-08-28 21:36  wujunbin  阅读(230)  评论(0编辑  收藏  举报