1、请写一个函数实现以下功能:字符串'open_door'转换成'OpenDoor','make_by_id'转换成'MakeById'
function strHandle($str)
{
$return = '';
$arr = explode('_', $str);
foreach ($arr as $val) {
$return .= ucfirst($val);
}
return $return;
}
echo strHandle('open_door');
echo '<hr>';
echo strHandle('make_by_id');
2、使用冒泡进行排序[56,8,170,50,3,1024];
//对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面
$arr=[1,56,8,170,50,3,1024,2];
$arrLengt = count( $arr );
for( $i = 0;$i<$arrLengt-1;$i++ ){//循环比较次数
for( $y = 0;$y<$arrLengt-$i-1;$y++ ){//已经排好的不用再比较
if( $arr[$y] > $arr[$y+1] ){//比较前后两个数据
$temp = $arr[$y];
$arr[$y] = $arr[$y+1];
$arr[$y+1] = $temp;
}
}
}
var_dump( $arr );
3、写一段php代码遍历某个目录下的所有文件和子文件夹
$dir = dirname(__DIR__);
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;
}
}
$files=my_scandir($dir);
var_dump($files);
//树形结构显示
tree(dirname(__DIR__));
function tree($directory)
{
$mydir = dir($directory);
echo "<ul>";
while ($file = $mydir->read()) {
if($file != "."&&$file != ".."){
if (is_dir("$directory/$file")) {
echo "<li style='color:blue'>$file</li>";
tree("$directory/$file");
} else{
echo "<li>$file</li>";
}
} } echo "</ul>";
$mydir->close();
}
4、写一函数获取一个文件夹的大小,并格式化(G、M、K)
$dir = dirname(__DIR__);
echo getRealSize(getDirSize($dir));
function getDirSize($dir)
{
$sizeResult = 0;
$handle = opendir($dir);
while (false !== ($FolderOrFile = readdir($handle))) {
if ($FolderOrFile != "." && $FolderOrFile != "..") {
if (is_dir("$dir/$FolderOrFile")) {
$sizeResult += getDirSize("$dir/$FolderOrFile");
} else {
$sizeResult += filesize("$dir/$FolderOrFile");
}
}
}
closedir($handle);
return $sizeResult;
}
// 单位自动转换函数
function getRealSize($size)
{
$kb = 1024; // Kilobyte
$mb = 1024 * $kb; // Megabyte
$gb = 1024 * $mb; // Gigabyte
$tb = 1024 * $gb; // Terabyte
if ($size < $kb) {
return $size . " B";
} else if ($size < $mb) {
return round($size / $kb, 2) . " KB";
} else if ($size < $gb) {
return round($size / $mb, 2) . " MB";
} else if ($size < $tb) {
return round($size / $gb, 2) . " GB";
} else {
return round($size / $tb, 2) . " TB";
}
}
5、使用mysqli函数 写一个更新操作
/**
* @param $table表名
* @param $set更新的数据
* $where 条件
*/
function mysqli_update($table,$set,$where=null){
$link = mysqli_connect( '127.0.0.1','root','root','mydb',3306 ) or die(mysqli_connect_error());
mysqli_set_charset($link,'utf8') or die('设置字符集失败');
if(empty($set)||!is_array($set)){
return '更新失败';
}
$set_str='';
foreach($set as $k=>$v){
$set_str.="`$k`='$v',";
}
$set_str=trim($set_str,',');
$where=trim($where);
if(empty($where)){
$where='1=1';
}
$sql = "UPDATE ".trim($table)." set ".$set_str." WHERE ".$where;
mysqli_query( $link,$sql );
return mysqli_affected_rows($link);
}
echo mysqli_update('test',['username'=>'aaa','phone'=>123456],'id=4');
6、写个函数用来对二维数组排序
$data = [
['key1'=>940,'key2'=>'blah'],
['key1'=>23,'key2'=>'this'],
['key1'=>894,'key2'=>'that']
];
比如以key1排序
$data = [
['key1'=>940,'key2'=>'blah'],
['key1'=>23,'key2'=>'this'],
['key1'=>894,'key2'=>'that']
];
foreach ($data as $key=>$value){
$key1[$key] = $value['key1'];
$key2[$key] = $value['key2'];
}
array_multisort($key1,SORT_NUMERIC,SORT_DESC,$key2,SORT_STRING,SORT_ASC,$data);
var_dump($data);
7、不用PHP内置函数 写一个字符串反转函数 hello=》olleh
$str = 'hello,你好!';
function str( $str = '' ){
$strlen=mb_strlen($str);//针对中文字符
$rev = '';
for($j=$strlen-1; $j>=0; $j--){
$rev .=mb_substr($str,$j,1);
}
return $rev;
}
echo str( $str );
8、使用五种以上方式获取一个文件的扩展名(后缀名)
$file_name='php.exc.tee';
echo get_ext4($file_name);
function get_ext1($file_name)
{
return substr(strrchr($file_name, '.'),1);
}
//2)
function get_ext2($file_name)
{
return strrpos($file_name, '.')===false?'':substr($file_name, strrpos($file_name, '.')+1);
}
//3)
function get_ext3($file_name)
{
return array_pop(explode('.', $file_name));
}
//4)推荐
function get_ext4($file_name)
{
return pathinfo($file_name,PATHINFO_EXTENSION );
}
//5)
function get_ext5($file_name)
{
$str = strrev($file_name);
return strrev(strchr($str,'.',true));
}
9、有一个字符串 $str= 'a,b,c,d'。请手写函数把','去掉
$str= 'a,b,c,d';
echo str_handle($str);
function str_handle($str){
return join('',explode(',', $str));//方法1
return str_replace(',', '', $str);//方法2
return preg_replace('/\,/', '', $str);//方法3
}
//使用for循环
function for_handle($str,$filter=','){
$len=strlen($str);
$new_str='';
for($i=0;$i<$len;$i++){
if($str[$i]!=$filter) $new_str.=$str[$i];
}
return $new_str;
}
10、输出100以内的质数
for( $i=2;$i<100;$i++ ){
$make = false;
$sq=sqrt($i);//只用计算到平方根就好,不用计算那么多次
for( $j=2;$j<=$sq;$j++ ){
if( $i%$j == 0 ){
$make = true;
break;
}
}
if( $make )continue;
echo $i.'<br/>';
}
11、使用PHP语言自定义一个函数,此函数作用是将一个句子按单词反序。例如One World One Dream,反序后变为 Dream One World One
$str = 'One World One Dream';
function mysort( $str = '' )
{
$strArr = explode(' ',$str );//先分割成数组
$strArr=array_reverse( $strArr );//数组倒转
return implode( ' ',$strArr );//数组连接成字符串
}
var_dump( mysort( $str ) );
12、判断字符串’aAbB’中有没有A字符
$str="AabB";
if( ($index=strpos($str,"A"))===false ){//注意用全等
echo '没有A这个字符';
}else{
echo 'A字符在第'.($index+1).'个';
}
13、如何快速提取URL中的域名?如下"
$Url='http://www.baidu.com/index.php?id=12&act=index';
echo parse_url($Url,PHP_URL_HOST );
14、用PHP写一段代码,实现不使用第3个变量,交换$a,$b的值,$a,$b的初始值自己定
$a =100;
$b =200;
$a = $a+$b;
$b = $a-$b;
$a = $a-$b;
echo "{$a},{$b}";
使用list()函数
$a = 1;
$b = 2;
list( $b,$a ) = [$a,$b];
echo $a,$b;
15、一列数的规则如下:1、1、2、3、5、8、13、21、34... 求第30位数是多少,用递归算法实现
echo fibo(30);
function fibo($n){
if( $n==1||$n==2 ){
return 1;
}
return fibo($n-2)+fibo($n-1);
}
16、如何查看一个单词,在一篇文章里出现的次数
$str = 'qwertqwertqwert';
echo substr_count( $str,'q' );//自带函数
echo preg_match_all('/q/',$str,$preg_arr);//用正则
17、打印出当前时间的前两天的时间格式,考察:【时间日期】
//方法一
$nowTime = time() - (2 * 24 * 60 * 60);
$date = date( 'Y m d h i s',$nowTime );
echo $date;
//方法二
$date = date( 'Y m d H i s',strtotime( '-2 day' ) );
var_dump( $date );
18、求两个日期的差数,例如2018-2-5 ~ 2018-3-6的日期差数
$begin = strtotime('2018-2-5');
$end = strtotime('2018-3-6');
echo ($end-$begin)/(24*3600);
19、用正则表达式判断$a是否是一个以半角逗号分隔的多个手机号码组成的字符串,是输出yes
考察:【正则表达式】
//* 匹配0个或者多个
//+ 匹配1个或者多个
//?匹配0个或者1个
$phone='15898561259,12898561259,12898518259';
$match = '/^1[23456789]\d{9}(,1[23456789]\d{9},*)+$/';
if (preg_match($match, $phone) ) {
echo 'yes';
}else{
echo 'no';
}
20、请写一段PHP代码,确保多个进程同时写入同一个文件成功
考察:【文件锁】
function writeData($filepath, $data)
{
$fp = fopen($filepath,'a');
do{
usleep(100);
}while (!flock($fp, LOCK_EX));
$res = fwrite($fp, $data."\n");
flock($fp, LOCK_UN);
fclose($fp);
return $res;
}
21、有一个网页地址,比如PHP研究室主页http://www.phpv.net/index.html,如何得到它的内容?
- 直接读取文件
$fh= file_get_contents('http://www.phpv.net/index.html');
echo $fh;
- 使用curl
$url = "http://www.phpv.net/index.html";
echo curl($url);
/**
* 请求接口返回内容
* @param string $url [请求的URL地址]
* @param string $params [请求的参数]
* @param int $ipost [是否采用POST形式]
* @return string
*/
function curl($url,$params=false,$ispost=0){
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
curl_setopt( $ch, CURLOPT_USERAGENT , 'JuheData' );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if( $ispost )
{
curl_setopt( $ch , CURLOPT_POST , true );
curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
curl_setopt( $ch , CURLOPT_URL , $url );
}
else
{
if($params){
curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
}else{
curl_setopt( $ch , CURLOPT_URL , $url);
}
}
$response = curl_exec( $ch );
if ($response === FALSE) {
//echo "cURL Error: " . curl_error($ch);
return false;
}
curl_close( $ch );
return $response;
}
22、写出以下代码输出
考察:【数据类型】数据类型转换函数
$a = 'www';
settype($a,'array'); //['www']
(string)$a; //'Array' 数组转化为'Array',对象转化为'Object'
floatval($a); //['www']=>1 float
echo gettype($a); //array
23、请输出下面程序的输出结果
考察:【运算符】逻辑运算符的短路
$a = 3;
$b = 6;
if( $a=5 || $b=7 ){ // '||'优先级高于'=',相当于$a=(5||$b=7),返回true
$a++; // 递增/递减运算符不影响布尔值,递减 NULL 值也没有效果,但是递增 NULL的结果是 1。
$b++; //7
}
var_dump($a,$b); //bool(true) int(7)
24. 下面输出的结果是什么___1_____。
考察:【函数】静态变量
$count = 5;
function get_count()
{
static $count = 0;
return $count++;
}
++$count; //6
get_count(); //$count=1
echo get_count(); //return 1++
25. 下面代码输出的结果是什么____2____。
$a = count("567") + count(null) + count(false);
echo $a;
//count()如果参数既不是数组,也不是实现 Countable 接口的对象,将返回1。如果是 NULL 则结果是 0。
26、请找出下面代码中的问题,修复并优化
//批量注册用户,每次>100个。
//注册新用户,要求用户名与email不能与以前的重复。
$mysqli = new Mysqli($host, $user, $pass);
for ($i=0; $i<count($_POST['user_info']); $i++) {
$info = $_POST['user_info'][$i];
$re_1 = $mysqli->query("SELECT * FROM `demo` WHERE `uname`='{$info['uname']}'");
$re_2 = $mysqli->query("SELECT * FROM `demo` WHERE `email`=$info['email']");
if (!($re_1 || $re_2)) {
$mysqli->query("INSERT INTO `demo` (`uname`, `email`) VALUES('$info['email']', '$info['uname']')");
}
}
1 $re_2查询字符串条件 变量+花括号
2 连接数据库,没有指定数据库名称
3 没有判断是否连接成功
4 没有开启事务
5 没有使用sql优化 select `id` from `demo` where `uname` = '{$info['uname']}' or email = '{$info['email']}';
6 插入字段没有对应
7 循环数据的时候没有判断数据的正确性isset( $_post['user_info'] )
9 插入更新删除一定要判断影响行数$mysqli->affected_rows()
10 没有开启错误日志
11 没有关闭数据库$mysqli->close()
12 count($_POST['user_info']) 没有向外提取,多次计算
13 数据插入数据库没有进行数据校验
14 判断应该为if( $re && $re->num_rows > 0 )