1. 冒泡排序
冒泡排序是一种简单的排序算法。
算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作重复地进行,直到没有再需要交换,也就是说该数列已经排序完成。
因为排序过程让较大的数往下沉,较小的往上冒,故而叫冒泡法。
算法步骤:
从第一个元素开始,比较相邻的元素,如果第一个比第二个大,就交换他们两个。
从开始第一对到结尾的最后一对,对每一对相邻元素作同样的工作。比较结束后,最后的元素应该会是最大的数。
对所有的元素重复以上的步骤,除了最后一个。
重复上面的步骤,每次比较的对数会越来越少,直到没有任何一对数字需要比较。
$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
function maopao($arr){
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
// 遍历i后面的元素,只要该元素小于当前元素,就把较小的往前冒泡
for ($j = $i+1; $j < $len; $j++) {
if ($arr[$i] > $arr[$j]) {
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
print_r(maopao($arr));
2.选择排序
思路:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
function selectSort($arr) {
$len = count($arr);
for ($i = 0; $i < $len ; $i++ ){
$minIndex = $i;
// 找出i后面最小的元素与当前元素交换
for ($j = $i + 1; $j <$len ; $j++ ){
if ($arr[$j] <$arr[$minIndex]) {
$minIndex = $j;
}
}
if ($minIndex != $i ){
$tmp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $tmp;
}
}
return $arr;
}
$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
print_r(selectSort($arr));
3. //快速排序
快速排序采用分治法实现排序,具体步骤:
从数列中挑出一个数作为基准元素。通常选择第一个或最后一个元素。
扫描数列,以基准元素为比较对象,把数列分成两个区。规则是:小的移动到基准元素前面,大的移到后面,相等的前后都可以。分区完成之后,基准元素就处于数列的中间位置。然后再用同样的方法,递归地排序划分的两部分。
function quickSort($arr){
//先判断是否继续执行
$len = count($arr);
if ($len <= 1 ){
return $arr;
}
//选择第一个元素作为基准
$bashOne = $arr[0];
//遍历除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$one = []; //大
$two = []; //小
for ($i = 1; $i <$len; $i++ ){
if($arr[$i] > $bashOne){
$one[] = $arr[$i];
}else{
$two[] = $arr[$i];
}
}
//再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
$one = quickSort($one);
$two = quickSort($two);
//合并
return array_merge($two,(array)$bashOne,$one);
}
$arr = [3,1,13,5,7,11,2,4,14,9,15,6,12,10,8];
print_r(quickSort($arr));
4.插入排序
算法步骤:
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果以排序的元素大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置中;
重复步骤2。
function insertSort($arr)
{
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$tmp = $arr[$i];
for ($j = $i - 1; $j >= 0; $j--) {
if ($tmp < $arr[$j]) {
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
} else {
break;
}
}
}
return $arr;
}
5. 二分查找(数组里查找某个元素)
基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)
function bin_search($arr,$low,$high,$k)
{
if($low <= $high)
{
$mid = intval(($low + $high)/2);
if($arr[$mid] == $k)
{
return $mid;
}
else if($k < $arr[$mid])
{
return bin_search($arr,$low,$mid-1,$k);
}
else
{
return bin_search($arr,$mid+1,$high,$k);
}
}
return -1;
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
print(bin_search($arr,0,9,3));
6. 归并排序
function mergeSort(&$arr) {
$len = count($arr);//求得数组长度
mSort($arr, 0, $len-1);
return $arr;
}
//实际实现归并排序的程序
function mSort(&$arr, $left, $right) {
if($left < $right) {
//说明子序列内存在多余1个的元素,那么需要拆分,分别排序,合并
//计算拆分的位置,长度/2 去整
$center = floor(($left+$right) / 2);
//递归调用对左边进行再次排序:
mSort($arr, $left, $center);
//递归调用对右边进行再次排序
mSort($arr, $center+1, $right);
//合并排序结果
mergeArray($arr, $left, $center, $right);
}
}
//将两个有序数组合并成一个有序数组
function mergeArray(&$arr, $left, $center, $right) {
//设置两个起始位置标记
$a_i = $left;
$b_i = $center+1;
while($a_i<=$center && $b_i<=$right) {
//当数组A和数组B都没有越界时
if($arr[$a_i] < $arr[$b_i]) {
$temp[] = $arr[$a_i++];
} else {
$temp[] = $arr[$b_i++];
}
}
//判断 数组A内的元素是否都用完了,没有的话将其全部插入到C数组内:
while($a_i <= $center) {
$temp[] = $arr[$a_i++];
}
//判断 数组B内的元素是否都用完了,没有的话将其全部插入到C数组内:
while($b_i <= $right) {
$temp[] = $arr[$b_i++];
}
//将$arrC内排序好的部分,写入到$arr内:
for($i=0, $len=count($temp); $i<$len; $i++) {
$arr[$left+$i] = $temp[$i];
}
}
$SortArr = array(2,9,1,8,3,8);
$res = mergeSort($SortArr);
print_r($res);
7.顺序查找
基本思想:从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
function seq_search($arr,$n,$k)
{
$array[$n] = $k;
for($i = 0;$i < $n; $i++)
{
if($arr[$i] == $k)
{
break;
}
}
if($i < $n){
return $i;
}else{
return -1;
}
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
print(seq_search($arr,9,9));
8. 遍历文件夹
function my_scandir($dir){
$files = array();
if($handle = opendir($dir)){
while (($file = readdir($handle))!== false) {
if($file != '..' && $file != '.'){
if(is_dir($dir."/".$file)){
$files[$file]=my_scandir($dir."/".$file);
}else{
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
var_dump(my_scandir('D:\xm\new_appq'));
9. 从一个标准url中取出文件的扩展名
function getExt($url)
{
$arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
//'scheme' => string 'http' (length=4)
//'host' => string 'www.sina.com.cn' (length=15)
//'path' => string '/abc/de/fg.php' (length=14)
//'query' => string 'id=1' (length=4)
$file = basename($arr['path']);// basename函数返回路径中的文件名部分
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));
10. Iterator接口
class Test implements Iterator{
private $item = array('id'=>1,'name'=>'php');
public function rewind(){
reset($this->item);
}
public function current(){
return current($this->item);
}
public function key(){
return key($this->item);
}
public function next(){
return next($this->item);
}
public function valid(){
return($this->current()!==false);
}
}
//测试
$t=new Test;
foreach($t as $k=>$v){
echo$k,'--->',$v,'<br/>';
}
11. 双向队列
class Deque{
private $queue=array();
public function addFirst($item){
return array_unshift($this->queue,$item);
}
public function addLast($item){
return array_push($this->queue,$item);
}
public function removeFirst(){
return array_shift($this->queue);
}
public function removeLast(){
return array_pop($this->queue);
}
}
12. 约瑟夫环
function king($n,$m){
$mokey = range(1, $n);
$i = 0;
while (count($mokey) >1) {
$i += 1;
$head = array_shift($mokey);//一个个出列最前面的猴子
if ($i % $m !=0) {
#如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($mokey,$head);
}
}
return $mokey[0];
}
// 测试
echo king(10,7);
13. 二维数组排序
function array_sort(&$arr, $order = []){
$result = [];
if (empty($arr)) {
return $result;
}
uasort($arr, function ($a, $b) use ($order) {
foreach ($order as $key => $sort) {
array_shift($order);
if ($a[$key] == $b[$key]) {
continue;
}
if ($sort === 'DESC') {
return ($a[$key] > $b[$key]) ? -1 : 1;
} else {
return ($a[$key] > $b[$key]) ? 1 : -1;
}
}
return 0;
});
foreach ($arr as $value) {
$result[] = $value;
}
$arr = $result;
}
//测试
$person = array(
array('id'=>2,'name'=>'lhangsan','age'=>23),
array('id'=>5,'name'=>'zisi','age'=>28),
array('id'=>3,'name'=>'apple','age'=>17)
);
array_sort($person, ['name' => 'asc']);
print_r($person);
14. 洗牌算法
$card_num = 54;//牌数
function wash_card($card_num){
$cards = $tmp = array();
for($i = 0;$i < $card_num;$i++){
$tmp[$i] = $i;
}
for($i = 0;$i < $card_num;$i++){
$index = rand(0,$card_num-$i-1);
$cards[$i] = $tmp[$index];
unset($tmp[$index]);
$tmp = array_values($tmp);
}
return $cards;
}
// 测试:
print_r(wash_card($card_num));设计模式
15. //三角形
function sanjiaoxing(){
for($i=0;$i<6;$i++){
for($j=0;$j<=$i;$j++){
echo "*";
}
echo "<br>";
}
}
sanjiaoxing();
16. 不用新变量直接交换现有两个变量的值
(1)list($a,$b)=array($b,$a);
(2)a=a+b,b=a-b,a=a-b
17转换数字(大写)
function daxie($num){
$da_num = array('零','一','二','三','四','五','六','七','八','九');
$return = '';
$len_num = strlen($num);
if(!is_numeric($num) || $len_num < 0){
return '';
}
for($i=0;$i<$len_num;$i++){
$return .= $da_num[ substr($num,$i,1)];
}
return $return;
}
echo daxie(123);
18. SQL语句
select * from table
where id in (10,32,22,76,13,44)
order by charindex(id,'10,32,22,76,13,44') desc
19. 时间
(1) echo date ( 'Y-m-d H:i:s' ,time()-60*60*24);
(2) echo date ( 'Y-m-d H:i:s' , strtotime ( '-1 day' ))
20. 字符串翻转
function reverse( $var )
{
$res = "" ;
for ( $i =0, $j = strlen ( $var ); $i < $j ; $i ++)
{
$res = $var [ $i ]. $res ;
}
return $res ;
}
$tmpvar = "wofang" ;
$res =reverse( $tmpvar );
echo $res ;
21. PSR-4规范
PHP的命名空间必须与绝对路径一致。
类名首字母大写。
除了入口文件之外,其他的PHP文件必须是一个类,不能有执行的代码。
22. 写出一个能创建多级目录的PHP函数
function create_dir($path,$mode = 0777){
if (is_dir($path)) {
# 如果目录已经存在,则不创建
echo "该目录已经存在";
} else {
# 不存在,创建
if (mkdir($path,$mode,true)) {
echo "创建目录成功";
} else {
echo "创建目录失败";
}
}
}
create_dir ('d/d/d');
23.PHP的垃圾收集机制是怎样的
PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为 NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
24. 确保多个进程同时写入同一个文件成功?核心思路:加锁
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//获得写锁,写数据
fwrite($fp, "write something");
// 解除锁定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
25. 递归
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
26获取远程网页内容
fopen
stream_get_contents
或者
file_get_contents
27. 页面跳转
header("Location:网址");//直接跳转
header("refresh:3;url=http://www.codingke.com/");//三秒后跳转
28.去除掉HTML
1. strip_tags
2.正则
3. ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
29. POSIX风格和兼容Perl,preg_match()
30. url中用get传值
urlencode()
31.html转意
htmlspecialchars或者htmlentities
32. 出将一个数组里的空值去掉的语句
第一种方法:
$array1 = array(' ',1,'',2,3);
print_r(array_filter($array1, "del"));
function del($var)
{
return(trim($var));
}
第二种方法:
$arr=array("",1,2,3,"");
$ptn="/\S+/i";
print_r(preg_grep($ptn,$arr));
33. Mysql常用优化方法有哪些
1.表优化:
合理使用索引
选取合适的字段属性 ; 尽量把字段设置为not null;
2.查询优化:
尽量少用join,少用子查询
少用like这种查询语句
34 mysql 数据库表的类型有哪些?
MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV
MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。
InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。
35.单词函数
lcfirst() - 把字符串中的首字符转换为小写
strtolower() - 把字符串转换为小写
strtoupper() - 把字符串转换为大写
ucfirst() - 把字符串中的首字符转换为大写
36.获取汉字的首个字母
function getFristL($str){
$s1 = iconv('UTF-8','gb2312',$str);
$s2 = iconv('gb2312','UTF-8',$s1);
$s = $s2 == $str ? $s1 : $str;
$asc = ord($s[0]) * 256 + ord($s[1]) - 65536;
if($asc >= -20319 && $asc <= -20284) return 'a';
if($asc >= -20283 && $asc <= -19776) return 'b';
if($asc >= -19775 && $asc <= -19219) return 'c';
if($asc >= -19218 && $asc <= -18711) return 'd';
if($asc >= -18710 && $asc <= -18527) return 'e';
if($asc >= -18526 && $asc <= -18240) return 'f';
if($asc >= -18239 && $asc <= -17923) return 'g';
if($asc >= -17922 && $asc <= -17418) return 'h';
if($asc >= -17417 && $asc <= -16475) return 'j';
if($asc >= -16474 && $asc <= -16213) return 'k';
if($asc >= -16212 && $asc <= -15641) return 'l';
if($asc >= -15640 && $asc <= -15166) return 'm';
if($asc >= -15165 && $asc <= -14923) return 'n';
if($asc >= -14922 && $asc <= -14915) return 'o';
if($asc >= -14914 && $asc <= -14631) return 'p';
if($asc >= -14630 && $asc <= -14150) return 'q';
if($asc >= -14149 && $asc <= -14091) return 'r';
if($asc >= -14090 && $asc <= -13319) return 's';
if($asc >= -13318 && $asc <= -12839) return 't';
if($asc >= -12838 && $asc <= -12557) return 'w';
if($asc >= -12556 && $asc <= -11848) return 'x';
if($asc >= -11847 && $asc <= -11056) return 'y';
if($asc >= -11055 && $asc <= -10247) return 'z';
return null;
};
echo getFristL("wo shi ce shi de");
37.判断大写还是小写字母
Ord函数
38判断一个元素是否出现出现在某个数组中
in_array
array_key_exists
array_search
39. 数据库设计三大范式
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
2. 第二范式(确保表中的每列都和主键相关。
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
40. mysql锁类型
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
全局锁
顾名思义,全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。
官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
41 存储过程
什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
存储过程的好处:
1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。
2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。
3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全
42.. 不使用cookie给客户端发送cookie
1)URL重写,就是把sessionId直接附加在URL路径的后面。
2)表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器
43. 请说明PHP中传值和引用的区别.什么时候用传值什么时候引用?
44.数据库索引有哪几种
种类
唯一索引和非唯一索引
单列索引和复合索引
B树索引、位图索引、反向键索引、基于函数的索引、簇索引、全局索引、局部索引等
45. 常用的端口号
21:FTP服务所开放的端口,用于上传、下载文件。
22:SSH端口,用于通过命令行模式远程连接Linux服务器或vps。
23:Telnet端口,用于Telnet远程登录服务器。
25:SMTP服务所开放的端口,用于发送邮件。
80:HTTP用于HTTP服务提供访问功能,例如,IIS、Apache、Nginx 等服务。您可以参阅、检查、TCP 80端口是否正常工作,排查80端口故障。
110:POP3用于POP3 协议,POP3 是电子邮件收发的协议。
143:IMAP用于IMAP(Internet Message Access Protocol)协议,IMAP 是用于电子邮件的接收的协议。 443:HTTPS 用于HTTPS服务提供访问功能。HTTPS 是一种能提供加密和通过安全端口传输的一种协议。 1433:SQL Server SQL Server的TCP 端口,用于供SQL Server对外提供服务。
1434:SQL Server SQL Server的UDP端口,用于返回SQL Server使用了哪个 TCP/IP 端口。
1521:Oracle通信端口,服务器上部署了Oracle SQL需要放行的端口。
3306:MySQL数据库对外提供服务的端口。
3389:Windows Server Remote Desktop Services Windows Server Remote Desktop Services(远程桌面服务)端口,可以通过这个端口远程连接服务器
8080:代理端口,同80端口一样,8080 端口常用于WWW代理服务,实现网页浏览。如果用了8080端口,访问网站或使用代理服务器时,需要在 IP 地址后面加上 :8080。安装Apache Tomcat服务后,默认服务端口为8080。 137、138、139 NetBIOS协议137、138 为UDP端口,通过网上邻居传输文件时使用的端口。
139通过这个端口进入的连接试图获得 NetBIOS/SMB 服务。NetBIOS协议常被用于Windows文件、打印机共享和Samba。
46.strtolower()和strtoupper()中文乱码问题
function mystrtoupper($a){
$b = str_split($a, 1);
$r = '';
foreach($b as $v){
$v = ord($v);//对该字符转成acsii码
if($v >= 97 && $v<= 122){//判断是否为小写字母
$v -= 32;//转换成大写字母
}
$r .= chr($v);//将ascii码再转为相应的字符。
}
return $r;
}
$a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl';
echo 'origin string:'.$a."\n";
echo 'result string:';
$r = mystrtoupper($a);
var_dump($r);
2
mb_convert_case
47.$str是一段html文本,使用正则表达式去除其中的所有js脚本
$pattern = ‘/<script.*>\.+<\/script>/’;
Preg_replace($pattern,’’,$str);
数组.
48.原生MYSQL查询
本地mysql数据库db_test里已建有表friend,数据库的连接用户为root,密码为123
friend表字段为:id,name,age,gender,phone,email
请使用php连接mysql,选择出friend表里age > 20的所有记录打印结果,并统计出查询出的结果总数。(5分)
<?php
$link = Mysql_connect(“localhost”,”root”,”123”) or die(“数据库连接失败!”);
Mysql_select_db(“db_test”,$link) or die(“选择数据库失败!”);
$sql = “select id,name,age,gender,phone,email from friend where age>20”;
$result = mysql_query($sql);
$count = mysql_num_rows($result);
While($row = mysql_fetch_assoc($result)){
Echo $row[‘id’];
}
49.常见SQL语句
1). mysql_query(“insert into user(name) values(‘test’)”);
$id = mysql_insert_id();
Mysql_query(“insert into score(uid,subjext,score) values(“.$id.”,’english’,’99’)”);
2).$sql = select uid,sunjext,score from score where uid=2 order by score desc limit 0,5;
3).select s.score from score s RIGHT JOIN user u ON u.id=s.uid where u.name=’张三;
4).delete from score where uid in(select id from user where name=’李四’)
Delete from user where name=’李四’;
5).delete from score;
6).drop table user;
50.
Redis 教程