PHP基础题目

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);
方法二:
$data = [
    ['key1'=>940,'key2'=>'blah'],
    ['key1'=>23,'key2'=>'this'],
    ['key1'=>894,'key2'=>'that']
];
function mySort($arr,$key){
    $arr = array_column($arr,null,$key);
    ksort($arr);
    return $arr;
}
var_dump(mySort($data,'key2'));

方法三:

$data = [
    ['key1'=>940,'key2'=>'blah'],
    ['key1'=>23,'key2'=>'this'],
    ['key1'=>894,'key2'=>'that']
];
function myArraySort($data,$key,$desc=true,$scale=2){
        if(empty($data)){
            return $data;
        }
        usort($data, function($a, $b) use ($key,$desc,$scale) {
            if($desc){
                return bccomp($b[$key],$a[$key],$scale);
            }
            return bccomp($a[$key],$b[$key],$scale);
        });
        return $data;
}
var_dump(myArraySort($data,'key2'));

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中的域名?如下"http://www.baidu.com/index.php?id=12&act=index",如何快速提取"www.baidu.com"

$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,如何得到它的内容?

  1. 直接读取文件
$fh= file_get_contents('http://www.phpv.net/index.html');
echo $fh;
  1. 使用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 )
posted @ 2021-09-28 17:09  成文的博客  阅读(182)  评论(0编辑  收藏  举报