mysql-5.7.26 解压安装教程

1、官网下载:https://downloads.mysql.com/archives/community/

11

2、解压到D:\mysql-5.7.26,并添加data目录及my.ini文件

22

3、编辑my.ini

[code]
[client]
port=3306
default-character-set=utf8
[mysqld]
# 设置mysql的安装目录
basedir=D:/netljc/mysql-5.7.26
# 设置mysql的数据目录
datadir=D:/netljc/mysql-5.7.26/data
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 开启查询缓存
explicit_defaults_for_timestamp=true
skip-grant-tables
[/code]

4、设置环境变量:D:\netljc\mysql-5.7.26\bin

5、以管理员身份打开cmd命令行执行安装命令

[code]
// 安装
mysqld -install

// 初始化
mysqld –initialize-insecure

// 启动
net start mysql

// 更改密码
set password for root@localhost = password(‘123456′)

// 登陆
mysql -u root -p[/code]

php常用的header头汇总

[code]
###内容类型###

header(‘Content-Type: text/html; charset=utf-8′); //网页编码

header(‘Content-Type: text/plain’); //纯文本格式

header(‘Content-Type: image/jpeg’); //JPG、JPEG

header(‘Content-Type: application/zip’); // ZIP文件

header(‘Content-Type: application/pdf’); // PDF文件

header(‘Content-Type: audio/mpeg’); // 音频文件

header(‘Content-type: text/css’); //css文件

header(‘Content-type: text/javascript’); //js文件

header(‘Content-type: application/json’); //json

header(‘Content-type: application/pdf’); //pdf

header(‘Content-type: text/xml’); //xml格式文件

header(‘Content-Type: application/x-shockw**e-flash’); //Flash动画

###对当前文档禁用缓存###

header(‘Cache-Control: no-cache, no-store, max-age=0, must-revalidate’);

header(‘Expires: Mon, 26 Jul 1997 05:00:00 GMT’);

###显示一个需要验证的登陆对话框###

header(‘HTTP/1.1 401 Unauthorized’);

header(‘WWW-Authenticate: Basic realm="Top Secret"’);

###声明一个下载的文件###

header(‘Content-Type: application/octet-stream’);

header(‘Content-Disposition: attachment; filename="ITblog.zip"’);

header(‘Content-Transfer-Encoding: binary’);

readfile(‘test.zip’);

###声明一个需要下载的xls文件###

header(‘Content-Disposition: attachment; filename=ithhc.xlsx’);

header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);

header(‘Content-Length: ‘.filesize(‘./test.xls’));

header(‘Content-Transfer-Encoding: binary’);

header(‘Cache-Control: must-revalidate’);

header(‘Pragma: public’);

readfile(‘./test.xls’);

header(‘HTTP/1.1 200 OK’); // ok 正常访问

header(‘HTTP/1.1 404 Not Found’); //通知浏览器 页面不存在

header(‘HTTP/1.1 301 Moved Permanently’); //设置地址被永久的重定向 301

header(‘Location: http://www.netljc.com/’); //跳转到一个新的地址

header(‘Refresh: 10; url=http://www.netljc.com/’); //延迟转向 也就是隔几秒跳转

header(‘X-Powered-By: PHP/6.0.0′); //修改 X-Powered-By信息

header(‘Content-language: en’); //文档语言

header(‘Content-Length: 1234′); //设置内容长度

header(‘Last-Modified: ‘.gmdate(‘D, d M Y H:i:s’, $time).’ GMT’); //告诉浏览器最后一次修改时间

header(‘HTTP/1.1 304 Not Modified’); //告诉浏览器文档内容没有发生改变
[/code]

MySQL事务隔离级别的理解

事物的4个特性:
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

多个事物并发执行时可能出现的现象:
脏读:事物A中读取到了事物B已经修改,但是还没提交的数据,如果事物B回滚了,这些数据就是脏数据,称之为脏读。
不可重复读:事物A中相同的条件查询数据,多次查询出来的值不一样,原因是事物B在两次查询的中间修改了数据。
幻读:事物A中相同的条件查询数据,多次查询出来的数据条数不一样,原因是事物B在两次查询的中间添加或者删除了数据。
不可重复读与幻读表现出来的都是查询结果不一致,一个侧重的是值被修改,一个侧重的是数据条数发生了变化;解决不可重复读需要锁住满足条件的记录,解决幻读需要锁表

事物的4个隔离级别:
Read Uncommitted(读取未提交内容):
该隔离级别,所有事务都可以看到其他未提交事务的执行结果。容易产生脏读,基本无用。
Read Committed(读取提交内容):
大多数数据库的默认事务隔离级别,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
Repeatable Read(可重读):
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
Serializable(串行化):
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

四种隔离级别,分别有可能产生问题如下所示:
shiwu

php文件大小单位(KB MB GB)转换函数

[code]
function formatBytes($size) {
$units = array(‘ B’, ‘ KB’, ‘ MB’, ‘ GB’, ‘ TB’);
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$units[$i];
}

echo formatBytes(10250); // 10.01 KB
[/code]

php字符串相关的函数总结

[code]
//按照指定长度对字符串进行折行处理
$str = "Supercalifragulistic";
$res = wordwrap($str,5,"<br>\n",true);
print_r($res);

//计算指定字符串在字符串中出现的次数
$res = substr_count("I love Shanghai. Shanghai is the biggest city in china.","Shanghai");
print_r($res);

//截取字符串
$res = substr("Hello world",6);
//把字符串中的字符 "ia" 替换为 "eo",注意是字符,不是整个字符串
$res = strtr("Hilla Warld","ia","eo");
$arr = array("Hello" => "Hi", "world" => "earth");
$res = strtr("Hello world",$arr);//以数组的方式进行替换
print_r($res);

$res = strtolower("Hello WORLD.");//把所有字符转换为小写
$res = strtoupper("Hello WORLD.");//把所有字符转换为大写
print_r($res);

//通过分隔符,逐一分隔字符串
$string = "Hello world. Beautiful day today.";
$token = strtok($string, " ");
while ($token !== false)
{
echo "$token<br>";
$token = strtok(" ");
}

//str1中第一部分全部的连续字符串都在str2中
$str1 = "abrabed defand";
$str2 = "abc";
$res = strspn($str1,$str2);;
print_r($res);

//计算字符串的长度
$res = strlen("Shanghai");
print_r($res);

//去除字符串中的html标签
$res = strip_tags("Hello <b>world!</b>");

$res = strpbrk("I love Shanghai!","Sh");//查找字符串在另一字符串中的第一次出现位置到结束的部分
$res = strrchr("I love Shanghai! Sh eee","Sh");//查找字符串在另一字符串中的最后位置出现到结束的部分

$res = strstr("Hello world!","world");//查找字符串在另一字符串中的第一次出现到结束的部分,strchr()函数的别名
$res = stristr("Hello world!","world");//查找字符串在另一字符串中的第一次出现到结束的部分,不区分大小写
$res = strstr("Hello world!","world",true);//查找字符串在另一字符串中的第一次出现到开始的部分,strchr()函数的别名

$res = strcspn("Hello world!","w");//查找某个字符第一次出现前有多少个字符

$res = strpos("You love php, I love PHP too!","PHP");//一个字符串在另一字符串中第一次出现的位置,区分大小写
$res = stripos("You love php, I love PHP too!","PHP");//一个字符串在另一字符串中第一次出现的位置,不区分大小写

$res = strrpos("You love php, I love PHP too!","PHP");//返回字符串在另一字符串中最后出现的位置,区分大小写
$res = strripos("You love php, I love PHP too!","PHP");//返回字符串在另一字符串中最后出现的位置,不区分大小写
print_r($res);

$res = strcmp("Hello world!","Hello world!");//比较两个字符串,区分大小写
$res = strnatcmp("Hello world!","Hello world!");//使用自然排序算法,比较两个字符串,区分大小写

$res = strcasecmp("shanghai","SHANGHAI");//比较两个字符串,不区分大小写
$res = strnatcasecmp("shanghai","SHANGHAI");//使用自然排序算法,比较两个字符串,不区分大小写

$res = strncmp("I love China!","I love Shanghai!",6);//比较两个字符串,区分大小写 只比较前面6个
$res = strncasecmp("I love China!","I love Shanghai!",6);//比较两个字符串,不区分大小写 只比较前面6个
$res = substr_compare("Hello world","Hello world",0);//从指定的开始位置比较两个字符串,相等返回0
print_r($res);

$res = str_word_count("I love Shanghai!",0);//返回字符串中单词的个数
$res = str_word_count("I love Shanghai!",1);//返回字符串中单词的数组
$res = str_word_count("I love Shanghai!",2);//返回字符串中单词的数组,其中的键名是单词在字符串中的位置,键值是实际的单词
print_r($res);

//把字符串打散到数组中去
$res = str_split("Shanghai",2);//每两个一组
print_r($res);

//随机地打乱字符串中的所有字符
$res = str_shuffle("I love Shanghai");
print_r($res);

//把字符串重复指定的次数
$res = str_repeat("Shanghai",5);
print_r($res);

//填充字符串到指定的长度
$str = "Hello World";
$res = str_pad($str,30,".");
print_r($res);

$res = str_replace("WORLD","Shanghai","Hello world!");//替换字符串中的一些字符,对大小写敏感
$res = str_ireplace("WORLD","Shanghai","Hello world!");//替换字符串中的一些字符,对大小写不敏感
$res = substr_replace("Hello","world ",0,1);//把字符串的一部分替换为另一个字符串
print_r($res);

//把查询字符串解析到变量中
parse_str("name=Bill&age=60");
parse_str("name=Bill&age=60",$myArray);//解析到数组中
print_r($myArray);

//返回字符串中第一个字符的 ASCII 值
$res = ord("Shanghai");
print_r($res);

$str = "Hello World!";
$res = trim($str,"Hello");//从字符串左右侧移除字符
$res = ltrim($str,"Hello");//从字符串左侧移除字符
$res = rtrim($str,"Hello");//从字符串右侧移除字符
print_r($res);

$res = lcfirst("Hello world!");//把字符串的首字符转换为小写
$res = ucfirst("Hello world!");//把字符串的首字符转换为大写
print_r($res);

//把数组元素组合为字符串implode|join是一样的结果
$arr = array(‘Hello’,’World!’,’I’,’love’,’Shanghai!’);
$res = implode(" ",$arr);
$res = join(" ",$arr);
print_r($res);

$str='<a href="test.html">¤←\’\"?测试页面</a>';
$res = htmlentities($str); //字符转换为 HTML 实体,对所有的html标记进行转换,html_entity_decode的反函数
print_r($res."\n",0);
$res = html_entity_decode($res);//把 HTML 实体转换为字符,htmlentities的反函数
print_r($res."\n",0);

$res = htmlspecialchars($str); //预定义的字符换为 HTML 实体,只对& " ‘ <>这几个基本的字符进行转码, htmlspecialchars_decode()的反函数
print_r($res."\n",0);
$res = htmlspecialchars_decode($res);//预定义的html实体转回字符htmlspecialchars的反函数
print_r($res."\n");

//把十六进制值转换为 ASCII 字符
$res = hex2bin("481122656c6c6f20576f726c6421");
print_r($res);

//输出单个或者多个字符串
$str1 = "I love Shanghai!";
$str2="What a nice day!";
print($str1 . " " . $str2);

$number1 = 9;
$number2 = 123;
$str = "Beijing";
//1、输出格式化的字符串
printf("测试参数1:%s测试参数2:%u<br/>",$number1,$number2);
//2、输出格式化的字符串,参数用数组传递
vprintf("测试参数1:%2\$s测试参数2:%1\$u<br/>",array($number1,$number2));

//3、返回格式化的字符串
$res = sprintf("测试参数1:%s测试参数2:%u<br/>",$number1,$number2);
print_r($res,0);
//4、返回格式化的字符串,参数用数组传递,%号的个数多余后面的参数需要使用占位符,如1\$表示第一个参数,2\$表示第二个参数
$res = vsprintf("测试参数1:%2\$s测试参数2:%1\$u<br/>",array($number1,$number2));
print_r($res,0);

$file = fopen("./runtime/test.txt","w");
//5、把格式化的字符串写入指定的文件,返回被写入字符串的长度
$res = fprintf($file,"测试参数1:%s测试参数2:%u",$number1,$number2);
print_r($res,0);
//6、把格式化的字符串写入指定的文件,参数用数组传递,返回被写入字符串的长度
$res = vfprintf($file,"测试参数1:%s测试参数2:%u",array($number1,$number2));
print_r($res);

//分隔字符串成数组
$str = "Hello world. I love Shanghai!";
$res = explode(" ",$str);//返回切割后的所有值
$res = explode(" ",$str,0);//返回一个元素的数组与explode(" ",$str,1)一样
$res = explode(" ",$str,2);//切割成几个元素
$res = explode(" ",$str,-2);//切割后的数组后面几个值不要
print_r($res);

//单向的字符串加密法
$res = crypt("Hello world!");
print_r($res);

/** 第二个参数
* 0 – 数组,ASCII 值为键名,出现的次数为键值
1 – 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数大于 0 的值
2 – 数组,ASCII 值为键名,出现的次数为键值,只列出出现次数等于 0 的值
3 – 字符串,带有所有使用过的不同的字符
4 – 字符串,带有所有未使用过的不同的字符
*/
$res = count_chars("Hello World!",3);//查看字符串中使用了哪些字符
$strArray = count_chars("Hello World!",1);//只列出出现次数大于 0
foreach ($strArray as $key=>$value)
{
print_r("字符 <b>’".chr($key)."'</b> 被找到 $value 次。<br>",0);
}
exit;

$res = convert_uuencode("Hello world!");//使用 uuencode 算法对字符串进行编码
print_r($res,0);
$res = convert_uudecode($res);//解码 uuencode 编码字符串
print_r($res);

//每隔多少个字符后面插入指定的支付串
$str = "Hello world!";
$res = chunk_split($str,6,"…");
print_r($res);

//删除字符串右侧的空白字符或其他字符
$res = chop("Hello World!","World!");
print_r($res);

//ASCII 值返回字符
echo chr(61) . "<br>"; // 十进制
echo chr(061) . "<br>"; // 八进制值
echo chr(0x61) . "<br>"; // 十六进制值
exit;

//字符串转换为十六进制值
$res = bin2hex("01");
print_r($res);

//在指定的字符前添加反斜杠
$res = addcslashes("Shanghai is the ‘biggest’ city in China. ‘a’",’a’);
$res = stripcslashes($res);//删除addcslashes函数添加的\
print_r($res);

//在预定义的字符前添加反斜杠(预定义字符串包括:单引号、双引号、反斜杠、null)
//php5.4之前的版本可以调用get_magic_quotes_gpc()检查是否默认开启了将POST、GET、COOKIE中的值自动转移的功能,如果开启了的就不需要调用这个函数了,避免重复转移,php5.4之后的版本需要自己去转移
$res = addslashes("Shanghai is the ‘biggest’ city in China. ‘a’");
$res = stripslashes($res);//删除addslashes函数添加的\
print_r($res);
[/code]

【知识点】php文件相关函数

fopen()-用来打开一个文件,打开的时候需要指定打开的模式
打开的模式包括:
r/r+ (只读/读写 都指向开头)
w/w+ (只写/读写 清空内容,如果文件不存在的时候会帮你创建)
a/a+ (追加写入/读写追加,指针指向末尾,如果文件不存在也会创建)
x/x+ (以写入的方式打开,并将指针指向开头,文件存在的时候会报错)
b 打开一个二进制文件
t windows才有

写入函数
fwrite()

fputs()

读取函数
fread()
fgets()
fgetc()

关闭文件函数
fclose()

不需要fopen函数打开的函数:
file_get_contents()
file_put_contents()

其他的读取函数
file() 将整个文件读取到一个数组中去
readfile() 内容读取出来并输出到一个缓冲区

访问远程文件
php.ini中需要开启allow_url_fopen,http协议只能只读,ftp协议可以只读或者只写

目录操作-名称相关
basename()\dirname()\pathinfo()
目录操作-目录读取
opendir()\readdir()\closedir()\rewinddir()
目录操作-目录删除
rmdir() 必须要是空目录才能删除
目录操作-目录创建
mkdir()

文件大小
filesize()

目录大小:
disk_free_space() 磁盘剩余空间
disk_total_space() 磁盘总共空间

文件拷贝:
copy()

删除文件
unlink()

文件类型
filetype()

重命名文件或者目录
rename()可以移动文件的位置

文件截取
ftruncate()

文件属性:
file_exists() 判断文件是否存在
is_readable() 是否可读
is_writable() 是否可写
is_executable()是否可执行
filectime() iNode的修改时间
fileatime() 访问的时间
filemtime() 整个的修改时间

文件锁
flock()

文件指针
ftell()
fseek()
rewind()

实例:在文件开头加入hello world
[code]
$file = "test.txt"
$handle = fopen($file,’r’);
$content = fread($handle,filesize($file));
$content="hello world".$content;
fclose($handle);
$handle = fopen($file,’w’);
fwrite($handle,$content);
fclose($handle);
[/code]
实例:遍历目录下的所有文件
[code]
function loopdir($dir){
$handle = opendir($dir);
while(($file = readdir($handle))!==false){
if($file!="." && $file!=".."){
echo $file.'<br/>';
if(filetype($dir.’/’.$file) == "dir"){
loopdir($dir.’/’.$file);
}
}
}
}
[/code]

【知识点】php正则表达式

1、正则作用
分割、匹配、查找、替换
2、正则函数
(1)preg_match(正则模块,字符串,数组的结果)
例如:preg_match(‘/abc/’,’askjdabc’,$array);
print_r($array);输出abc的数组
(2)ereg(正则模块,字符串,数组的结果)
例如:ereg(‘abc’,’askjdabc’,$array);
print_r($array);
3、正则元素
(1)原子a-z、原子表、转义字符等
a、a-z\0-9等 //常见的字符
b、(abc) //用圆括号括起来的N单元符号,全匹配
c、[^abc]元子表,匹配其中的一个 ^表示向反匹配
d、转义字符
\d 包含所有数字[0-9]
\D 除所有数字外[^0-9]
\w 包含所有的普通字符[a-zA-Z_0-9]
\W 除所有的普通字符外的[^a-zA-Z_0-9]
\s 包含所有空白域如回车、换行、分页[\f\n\r]
\S 包含空白符之外的其他字符
…………
(2)元字符号(有特殊功能的字符)
* 匹配前一个内容的0次1次或多次
. 匹配任何一个内容0次1次或多次,但不包含回车换行
+ 匹配前一个内容的1次或多次
?匹配前一个内容的0次或1次 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的
| 选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配)
^ 匹配字符串首部内容
$ 匹配字符串尾部内容
\b 匹配单词边界,边界可以是空格或者特殊符合
\B 匹配除带单词边界意外内容
{m} 匹配前一个内容的重复次数为M次
{m,} 匹配前一个内容的重复次数大于等于M次
{m,n} 匹配前一个内容的重复次数M次到N次
( ) 合并整体匹配,并放入内存,可使用\\1 \\2…依次获取括号中储存在内存中的内容 (?:)让子模式不被放入结果的数组中
(?=pattern) 正向肯定预查 在匹配前查看其中是否包含了某些字符,例如(必须包含字母数字和指定的特殊字符):/^(?=.*[0-9].*)(?=.*[a-zA-Z].*)(?=.*[\@\&\_\/\\\\\*].*)[a-zA-Z0-9\@\&\_\/\\\\\*]{6,16}$/;
(?!pattern) 正向否定预查 例如(不包含空白的字符): /^(?!.*\s.*).{4,20}$/

(3)模式修正符(i\m\S\U大小写全匹配等)
( ) 圆括号因为是内存处理所以最高
* ? + { } 重复匹配内容其次
^ $ \b 边界处理第三
| 条件处理第四
最后按照运算顺序计算匹配

/正则/U
i 正则内容在匹配时候不区分大小写(默认是区分的)
m 每行分别进行匹配
s 修正.的换行
S 将转义回车取消是为单行匹配如. 匹配的时候
x 忽略正则中的空白
A 强制从头开始匹配
D 强制$匹配尾部无任何内容 \n
U 禁止贪婪匹配 只跟踪到最近的一个匹配符并结束,U不通用,可以用?解决贪婪如(.*? 或者 .+?)
常用在采集程序上的正则表达式

4、preg_match_all(正则,内容,正则结果)全部匹配函数
5、preg_replace(正则,替换后内容,替换前内容,替换的个数)正则替换函数
6、preg_split(正则,结果)正则切割

后项引用:
正则表达式匹配出来的值,在后面进行引用
$str = ‘abc‘;
preg_replace(‘/(.*)<\/span>/’,’\\1′,$str);

贪婪模式:
$str = ‘abcbcd‘;
preg_replace_all(‘/(.*?)<\/span>/’,’\\1′,$str);
preg_replace_all(‘/(.*)<\/span>/U’,’\\1′,$str);

中文匹配:
UTF-8汉字编码范围0x4e00-0x9fa5,需要使用u修正字符把字符串当成utf8来匹配
‘/[\x{4e00}-x{9fa5}]+/u’
GB2312编码范围0xb0-0xf7,0xa1-0xfe,要使用chr()
‘/[‘.chr(0xb0).’-‘.chr(0xf7).’][‘.chr(0xa1).’-‘.chr(0xfe).’]/’

实例:匹配所有img标签中的src值
$str = ‘aaa‘;
$pattern = ‘//i';
preg_match($pattern,$str,$match);

php.ini中的magic_quotes_gpc选项

在php5.4之前的版本中有一个magic_quotes_gpc配置项,当设置magic_quotes_gpc=on的时候,PHP会对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes();也就是自动转移预定义字符,以达到防止sql注入,增加安全性,但是这个选项在php5.4之后的版本中被删除了,主要是为了把安全编码交给了用户自己,从而避免了magic_quotes_gpc未设置,用户依赖这个设置而带来了安全隐患。我们在执行sql之前可以对查询字段的值做如下处理:
$value = mysql_real_escape_string($value);

php数组相关的函数总结

[code]
function printRE($res,$is_exit=1){
echo ‘<pre>';
print_r($res);
echo ‘</pre>';
$is_exit==1 && exit();
}

//用“自然排序”算法对数组排序
//自然排序:a1 a2 a3 a11 a22 a33
//标准排序:a1 a11 a2 a22 a3 a33
$my_array = array(‘a2′,’a11′,’a1′,’a22′,’a33′,’a3′);
natsort($my_array);
printRE($my_array);

//把数组中的元素按随机顺序重新排序
$my_array = array("red","green","blue","yellow","purple");
shuffle($my_array);
printRE($my_array);

//创建包含指定范围单元的数组,第三个参数是步长
$number = range(0,10,2);
printRE($number);

//一种遍历数组的方式
$my_array = array("Dog","Cat","Horse");
while (list($k,$v)=each($my_array)){
echo "key={$k},value={$v}<br/>";
}
//把数组中的值赋值给变量
$my_array = array("Dog","Cat","Horse");
list($a, $b, $c) = $my_array;
printRE("\$a = $a; \$b = $b; \$c = $c");

$people = array("Bill", "Steve", "Mark", "David");
$res = current($people);//返回数组中的当前元素 与pos()一样
printRE($res,0);
$res = end($people);//返回数组中的最后一个元素
printRE($res,0);
$res = key($people);//取得当前键的位置
printRE($res,0);
$res = prev($people);//返回数组中的前一个元素
printRE($res,0);
$res = next($people);//返回下一个元素
printRE($res,0);
$res = reset($people);//重置到第一个元素
printRE($res,0);
$res = each($people);//返回当前元素的键名和键值,并将指针向前移动一个位置
printRE($res);

//返回数组中元素的数目,和sizeof()功能一致
$cars=array("Volvo","BMW",array("Toyota",’aaa’));
$res = count($cars);
$res1 = count($cars,1);
printRE($res,0);//递归计数
printRE($res1);

//将数组还原成变量
$my_array = array("a" => "aaa","b" => "ccc", "c" => "ccc");
extract($my_array);
printRE("\$a = $a; \$b = $b; \$c = $c");

//将多个变量组装成数组,与extract()函数相反
$a = ‘aaa';
$b = ‘bbb';
$c = ‘ccc';
$res = compact(‘a’,’b’,’c’);
printRE($res);

$age=array("Bill"=>"60","Steve"=>"56","Aark"=>"31");
sort($age);//值升序,键名被删除
printRE($age);
rsort($age);//值降序,键名被删除
printRE($age);

asort($age);//对关联数组按照值进行升序排序,并保持索引关系
printRE($age);
arsort($age);//对关联数组按照值进行降序排序,并保持索引关系
printRE($age);

ksort($age);//对数组按照键名升序,并保持索引关系
printRE($age);
krsort($age);//对数组按照键名降序,并保持索引关系
printRE($age);

//删除数组中的第一个元素
$a=array("a"=>"red","b"=>"green","c"=>"blue");
$res = array_shift($a);
printRE($res,0);
printRE($a);

//删除数组中的最后一个元素
$a=array("red","green","blue");
$res = array_pop($a);
printRE($res,0);
printRE($a);

//在数组开头插入一个或多个元素
$a=array("a"=>"red","b"=>"green");
array_unshift($a,"blue","blue2");
printRE($a);

//将一个或多个元素插入数组的末尾(入栈)。
$a=array("red","green");
array_push($a,"blue","yellow");
printRE($a);

//删除数组中的重复值
$a=array("c"=>"aed","b"=>"green","a"=>"aed");
$res = array_unique($a);
printRE($res);

//用回调函数过滤数组中的元素
function ta($var)
{
return $var==3?true:false;
}
$a1=array("a","b",2,3,4);
$res = array_filter($a1, "ta");
printRE($res);

//对数组中的每个元素应用用户自定义函数
function t3($value,$key)
{
echo "The key $key has the value $value<br>";
}
$a=array("a"=>"red","b"=>"green","c"=>"blue");
array_walk($a,"t3");exit;

//通过使用用户自定义函数,以字符串返回数组。
function t2($v1,$v2)
{
return $v1 . "-" . $v2;
}
$a=array("Dog","Cat","Horse");
$res = array_reduce($a,"t2",5);
printRE($res);

//把数组中的每个值发送到用户自定义函数,返回新的值。
function t1($v)
{
return($v*$v);
}

$a=array(1,2,3,4,5);
$res = array_map("t1",$a);
printRE($res);

//返回数组的所有值
$a=array("Name"=>"Bill","Age"=>"60","Country"=>"USA");
$res = array_values($a);
printRE($res);

//返回数组中所有值的和
$a=array(5,15,25);
$res = array_sum($a);
printRE($res);

//计算并返回数组的乘积
$a = array(5,2,3);
$res = array_product($a);
printRE($res);

//返回数组中被选定的元素
$a=array("red","green","blue","yellow","brown");
$res = array_slice($a,1,2,true);//从第二个开始选择两个 true – 保留键名
printRE($res);

//检查数组中是否存在指定的值
$people = array("Bill", "Steve", "Mark", "David");
if (in_array("Mark", $people))
{
echo "匹配已找到";
}
else
{
echo "匹配未找到";
}

//搜索数组中给定的值并返回键名,第三个参数如果被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素
$a=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"red",);
$res = array_search("red",$a);
printRE($res);

//以相反的顺序返回数组,倒序
$a=array("a"=>"Volvo","b"=>"BMW","c"=>"Toyota");
$a=array("Volvo","c"=>"BMW","Toyota");
$res = array_reverse($a,true);
printRE($res);

//递归地使用后面数组的值替换第一个数组的值。直白点就是可以处理二维数组
$a1=array("a"=>array("red"),"b"=>array("green","blue"));
$a2=array("a"=>array("yellow"),"b"=>array("black"));
$a3=array("a"=>array("orange"),"b"=>array("burgundy"));
$res = array_replace_recursive($a1,$a2,$a3);
printRE($res);

//使用后面数组的值替换第一个数组的值。
//键在$a1中存在$a2中不存在,则保留$a1中的值;$a1中不存在,$a2中存在,则$a2覆盖$a1;都存在时直接替换
$a1=array("a"=>"red","b"=>"green");
$a2=array("a"=>"orange","burgundy");
$res = array_replace($a1,$a2);
printRE($res);

$a1=array("red","green");
$a2=array("blue","yellow");
$res = array_replace($a1,$a2);
printRE($res);

//返回数组中一个或多个随机的键
$a=array("red","green","blue","yellow","brown");
$random_keys=array_rand($a,3);
printRE($random_keys);

//用值将数组填补到指定长度,负数表示从前面进行填充
$a=array("red","green");
$res = array_pad($a,5,"blue");
printRE($res);

//使用指定的键和值填充数组
$keys=array("a","b","c","d");
$res=array_fill_keys($keys,"blue");
printRE($res);

//用给定的键值填充数组。从第三个位置开始用blue填充4位
$res=array_fill(3,4,"blue");
printRE($res);

//对多个数组或多维数组进行排序(字符串键名将被保留,但是数字键名将被重新索引;可以在每个数组后设置排序顺序和排序类型参数。如果没有设置,每个数组参数会使用默认值。)
//3、对年龄降序,用户名升序
$array = array(
array("id"=>1,"age"=>20,"username"=>"user3"),
array("id"=>2,"age"=>21,"username"=>"user2"),
array("id"=>3,"age"=>20,"username"=>"user1"),
array("id"=>4,"age"=>22,"username"=>"user4")
);

foreach ($array as $key=>$value){
$age[$key] = $value[‘age’];
$name[$key] = $value[‘username’];
}

array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
printRE($array);

//2、对多个数组排序,先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序
//注意:对这个函数的正确理解是,先对第一个数组进行排序,然后对应移动第二个数组的顺序,如果第一个数组中有相同的值,这个时候才会用第二个数组来排序
$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy");
array_multisort($a1,$a2);
printRE($a1,0);
printRE($a2);

//1、默认SORT_ASC,可使用SORT_DESC
$a=array("Dog","Cat","Horse","Bear","Zebra");
array_multisort($a,SORT_DESC);
printRE($a);

//递归地合并一个或多个数组
$a1=array("a"=>"red","b"=>"green");
$a2=array("c"=>"blue","b"=>"yellow");
$res = array_merge_recursive($a1,$a2);
printRE($res);

//把一个或多个数组合并为一个数组,如果键名相同,后面会覆盖前面的
$a1=array("a"=>"red","b"=>"green");
$a2=array("c"=>"blue","b"=>"yellow");
$res = array_merge($a1,$a2);
printRE($res);

//返回包含数组中所有键名的一个新数组
$a=array("Volvo"=>"XC90","BMW"=>"X5","Toyota"=>"Highlander");
$res = array_keys($a);
printRE($res);

//检查指定的键名是否存在于数组中
$a=array("Volvo"=>"XC90","BMW"=>"X5");
if (array_key_exists("Volvo",$a))
{
die("键存在!");
}
else
{
die("键不存在!");
}

//比较两个数组的值,并返回交集
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
$res=array_intersect($a1,$a2);
printRE($res);

//反转数组中所有的键以及它们关联的值
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$res=array_flip($a1);
printRE($res);

//比较数组,返回差集(比较键名和键值,使用用户自定义的键名比较函数)。
function myfunction($a,$b)
{
echo $a.’ ‘.$b.'<br/>';
return 1;
if ($a===$b)
{
return 0;
}
return ($a>$b)?1:-1;
}
$a1=array("a"=>"1","b"=>"2","c"=>"3");
$a2=array("a"=>"1","b"=>"2","c"=>"3");
$res=array_diff_uassoc($a1,$a2,"app\web\controllers\myfunction");
printRE($res);

//取数组的差集(键比较取差值),在$a1不在$a2\$a3的值
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"black","g"=>"purple");
$a3=array("a"=>"red","b"=>"black","h"=>"yellow");
$res=array_diff_key($a1,$a2,$a3);
printRE($res);

//取数组的差集(键值同时比较取差值),在$a1不在$a2\$a3的值
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"black","g"=>"purple");
$a3=array("a"=>"red","b"=>"black","h"=>"yellow");
$res=array_diff_assoc($a1,$a2,$a3);
printRE($res);

//取数组的差集(只用值取差值),在$a1不在$a2\$a3的值
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"black","g"=>"purple");
$a3=array("a"=>"red","b"=>"black","h"=>"yellow");
$res=array_diff($a1,$a2,$a3);
printRE($res);

//统计数组中所有的值出现的次数
$a=array("A","Cat","Dog","A","Dog");
$res = array_count_values($a);
printRE($res);

//通过合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组元素为键值
$fname = array("Peter","Ben","Joe");//key
$age = array("35","37","43");//value
$res = array_combine($fname,$age);
printRE($res);

//返回数组单列的值,php5.5+
$a = array(
array(
‘id’ => 5698,
‘first_name’ => ‘Peter’,
‘last_name’ => ‘Griffin’,
),
array(
‘id’ => 4767,
‘first_name’ => ‘Ben’,
‘last_name’ => ‘Smith’,
),
array(
‘id’ => 3809,
‘first_name’ => ‘Joe’,
‘last_name’ => ‘Doe’,
)
);

$res = array_column($a, ‘last_name’);//提取last_name列
$res = array_column($a, ‘last_name’, ‘id’);//用id作为键
printRE($res);

//把一个数组分割为新的数组块,一维数组分割后就变成了二维数组
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43","Harry"=>"50");
$res = array_chunk($age,2,true);//保留原键名
$res = array_chunk($age,2,false);//键名从0重新开始
printRE($res);

//将数组的键名返回为大写或者小写
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
$res = array_change_key_case($age,CASE_UPPER);
$res = array_change_key_case($age,CASE_LOWER);
printRE($res);
[/code]

php排序函数array_multisort详解

定义
array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。
初看之下,感觉就是分别对多个数组按照指定的规则进行排序。然后我们实验一把:
[code]
$a1=array("Dog","Dog","Cat");
$a2=array("Pluto","Fido","Missy");
array_multisort($a1,SORT_ASC,$a2,SORT_ASC);
print_r($a1);
print_r($a2);

输出结果:
Array
(
[0] => Cat
[1] => Dog
[2] => Dog
)

Array
(
[0] => Missy
[1] => Fido
[2] => Pluto
)
[/code]
$a1的排序没问题,但$a2并没有按照升序排呀,这些怎么回事,难道这个函数有bug,不是说好的可以对多个数组进行排序么?其实这个地方是一个误区,也是手册上没有说清楚的地方。我们仔细观察一下排序之前两个的数组对应关系,是这样的:
Dog=>Pluto
Dog=>Fido
Cat=>Missy
然后我们在看看排序之后两个数组的对应关系,是不是还是这个对应关系,对了,依然是这个关系。
$a,$b是两个数组,如果排序之后,$a数组的第3个元素被排到了第一位,那么$b的第三个元素不管他在$b中的大小都会排在第一位。
由此我们可以得出这个数组的排序都是根据第一个数组的值大小进行排序的,然后其他的数组都按照第一个数组的调整策略进行调整,交换相应的位置,只有当第一个数组出现了相同的值的时候,才会根据第二个数组中相同位置的值和对第二个数组设置的排序规则进行排序。可能有人就要问了,为什么要搞这么麻烦,有什么实际应用场景呢。好,那我们就来个实际的场景,对一组用户按照年龄降序排序、用户名升序排列,用户数据如下:
年龄20,user3
年龄21,user2
年龄20,user1
年龄22,user4
[code]
$array = array(
array("id"=>1,"age"=>20,"username"=>"user3"),
array("id"=>2,"age"=>21,"username"=>"user2"),
array("id"=>3,"age"=>20,"username"=>"user1"),
array("id"=>4,"age"=>22,"username"=>"user4")
);

foreach ($array as $key=>$value){
$age[$key] = $value[‘age’];
$name[$key] = $value[‘username’];
}
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
print_r($array);

排序结果:
Array
(
[0] => Array
(
[id] => 4
[age] => 22
[username] => user4
)

[1] => Array
(
[id] => 2
[age] => 21
[username] => user2
)

[2] => Array
(
[id] => 3
[age] => 20
[username] => user1
)

[3] => Array
(
[id] => 1
[age] => 20
[username] => user3
)

)
[/code]