【PHP Interview 004】
1. echo count("abc"); 输出什么?
答:"1"
count — 计算数组中的单元数目或对象中的属性个数
int count ( mixed $var [, int $mode ] ), 如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。
对于对象,如果安装了 SPL,可以通过实现Countable 接口来调用 count()。该接口只有一个方法 count(),此方法返回 count() 函数的返回值。
2. 用PHP写出显示客户端IP与服务器IP的代码
答:$_SERVER['SERVER_ADDR'] 服务器ip
function get_client_ip() { if (getenv('HTTP_CLIENT_IP')) { $client_ip = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $client_ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('REMOTE_ADDR')) { $client_ip = getenv('REMOTE_ADDR'); } else { $client_ip = $_SERVER['REMOTE_ADDR']; } return $client_ip; }
3. error_reporting(2047)什么作用?
答:PHP 显示所有错误和警告。
4. echo,print()和print_r()有什么区别?
答:echo是一个语言结构,没有返回值。
print是一个语言结构,返回int类型的值。[只能打印int string]
print_r()是一个函数,返回bool类型值,按结构输出变量的值。打印关于变量的易于理解的信息[数组、对象等]
5. 打开php.ini中的Safe_mode,会影响哪些函数?至少说出6个
move_uploaded_file — 将上传的文件移动到新位置
exec — 执行一个外部程序
system — 执行外部程序,并且显示输出、passthru — 执行外部程序并且显示原始输出
popen — 打开进程文件指针、fopen — 打开文件或者 URL
mkdir()、rmdir()、rename()、unlink()、copy()、
chgrp() — 改变文件所属的组、chown() — 改变文件的所有者、 chmod() — 改变文件模式、touch() — 设定文件的访问和修改时间、
symlink()-建立符号连接、link() — 建立一个硬连接、parse_ini_file()
6. 写个函数来解决多线程同时读写一个文件的问题。
答:flock($hander,LOCK_EX);
7. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)
function validEmail($email) { $regex = '/^[\w\-\.]+@[0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?$/'; if (preg_match($regex, $email)) { return true; } else { return false; } }
9. MySQL数据库,一天一万条以上的增量,怎么优化?
1)按月进行分表,因为是日志表,主要操作是insert操作,所以每月初自动生成新的数据表,数据插入到对应月份的那张数据表。[比如表明前缀是cdb_smslog 后面加200910 及时cdb_smslog_200910]
2)对于insert频率较大的表,可以适当删除不常用的索引,可以减少对表索引维护的开销
3)在业务允许的情况下,也就是说不需要事物机制,建议用myisam引擎,相比较而言,myisam比innodb的批量插入要快很多,当然还有archive引擎,不过这个引擎很少用,所以建议还是用myisam
10. 写出一种排序算法(要写出代码),并说出优化它的方法。
function maopao($arr) { $count = count($arr); for ($i = 0; $i < $count - 1; ++$i) { for ($j = 0; $j < $count - $i - 1; ++$j) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } } } return $arr; } function shunxu($arr) { $count = count($arr); for ($i = 0; $i < $count - 1; ++$i) { $pos = $i; for ($j = $i + 1; $j < $count; ++$j) { $p = $arr[$pos] > $arr[$j] ? $j : $pos; } if ($pos != $i) { $tvalue = $arr[$i]; $arr[$i] = $arr[$p]; $arr[$p] = $tvalue; } } return $arr; }
11. 写个函数用来对二维数组排序。
//排序二维数组 function array_sort($array, $order_row, $order_by = "ASC") { $array_temp = array(); foreach ($array as $key => $value) { $array_temp[$key] = $value[$order_row]; } if ($order_by == 'ASC') { asort($array_temp); } else { arsort($array_temp); } $result_array = array(); foreach ($array_temp as $key => $val) { $result_array[$key] = $array[$key]; } return $result_array; } $arr = array( array('num' => 5, 'value' => 6), array('num' => 2, 'value' => 39), array('num' => 36, 'value' => 29) ); print_r(array_sort($arr, 'num'));
12. 写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
//截取一个全路径的文件的扩展名 $path = str_replace('\\', '/', __FILE__); function getExt1($path) { $arr = explode('.', $path); return $arr[count($arr) - 1]; } function getExt2($path) { return strrchr($path, '.'); } function getExt3($path) { $position = strrpos($path, '.'); return substr($path, $position); } function getExt4($path) { preg_match_all('/^[\w\/\:]+(\.[\w]+)$/', $path, $out); return $out[1][0]; } function getExt5($path) { return preg_replace('/^[^\.]+(\.[\w]+)$/', '${1}', $path); }
13. 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
//方案一,使用php模拟这个过程 function king($n, $m) { $monkeys = range(1, $n); $i = 0; while (count($monkeys) > 1) { if (($i + 1) % $m == 0) { unset($monkeys[$i]); } else { array_push($monkeys, $monkeys[$i]); unset($monkeys[$i]); } $i++; } return current($monkeys); } //方案二,数学方法 function yuesefu($n, $m) { $r = 0; for ($i = 2; $i <= $n; $i++) { $r = ($r + $m) % $i; } return $r + 1; }
浙公网安备 33010602011771号