• php开发工程师面试题知识点总结(一)


    1.PHP 优先级

    $a = 0;
    $a = (2 > 2) ? 2 : 3 ? $a++ : --$a;
    //解析:( false ? 2 : 3) ? $a++ : --$a
    //  3 ? $a++ : --$a
    var_dump($a);//0
    echo "<br>";
     
    $a = (2 > 2) ? 2 : 3 ? ++$a : --$a;
    var_dump($a);//1
     
    echo "<br>";
    $a = true ? 0 : true ? 1 : 2;// (true ? 0 : true) ? 1 : 2 = 2 左结合
    var_dump($a);//0
     
     
    $a = 1;
    $b = 2;
    $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5  右结合
     
    $a = 1;
    echo $a + $a++; //3
    

    优先级详情:https://www.php.net/manual/zh/language.operators.precedence.php

    2.从mysql 数据库中随机取出一条记录

    方法1:

    select * from 表名 order by rand( ) limit 1;  //此处的1就是取出数据的条数
    

    但这样取数据网上有人说效率非常差的,那么要如何改进呢

    搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

    方法2:

    SELECT *
    FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
    WHERE t1.id >= t2.id
    ORDER BY t1.id ASC LIMIT 5;
    

    但是这样获得的是5条连续的记录。解决办法只能是每次查询一条,查询5次,但这个又不能满足我的要求了,我要一次找几条

    方法3: 高效写法

    SELECT * FROM user  WHERE userId >= ((SELECT MAX(userId) FROM user )-(SELECT MIN(userId) FROM user )) * RAND() + (SELECT MIN(userId) FROM user )  LIMIT 5
    

    个人感觉:方法3和方法2区别不大.

    3.用php写一段代码,实现不适用第3个变量,变换$a,$b的值,$a,$b初始值自己定

    方法1:简洁易懂 ,没得说,顶上

    list($a, $b) = array($b, $a);
    

    方法二:两个变量必须是数字

    $a=5; $b=7;
    $a = $a + $b;
    $b = $a - $b;
    $a = $a - $b;
    echo $a,$b;//7 5
    

    方法3:(这个就比较有限制,必须用一个两个字符串都都不能出现的字符做为分隔符) 

    $a = $b.','.$a ;
    $a = explode(',', $a);
    $b = $a[1];
    $a = $a[0];
    

    方法4:可能存在编码问题

    $a = $a . $b;
    $b = strlen( $b );
    $b = substr( $a, 0, (strlen($a) - $b ) );
    $a = substr( $a, strlen($b) );
    

    方法5:两个变量的长度必须一样

    $a = $a^$b;
    $b = $b^$a;
    $a = $a^$b;
    

    4.char/varchar 区别,谁的存储速度快,为何?

    一.数据存储开销

    1.char(n) 是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。

    在程序中,会返回给你8位,后面的用空格补上;

    在数据库中,char(8),占用16个字节(1个字符=2个字节);

    2.varchar(n) 是长度为 n 个字节的可变长度且非 Unicode 的字符数据。n必须是一个介于1和 8000之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

    二.插入数据

    1.char列的NULL值占用存储空间。

    varchar列的NULL值不占用存储空间。

    插入同样数量的NULL值,varchar列的插入效率明显高出char列。

    插入不为null的数据时,无论插入数据涉及的列是否建立索引,varchar列的插入效率也是明显高出char列。

    三.更新数据

    如果更新的列上未建立索引,则char的效率低于varchar,但效率差异不大。

    如果更新的列上建立索引,则char的效率低于varchar,并且效率差异很大。

    四.修改结构

    无论增加或删除的列的类型是char还是varchar,操作都能较快的完成,而且效率上没有什么差异。

    对于增加列的宽度而言,char与varchar有非常明显的效率差异,varchar列基本上不花费时间,而修改char列需要花费很长的时间。

    五.数据检索

    无论是否通过索引,varchar类型的数据检索略优于char的扫描。

    那实际开发中,我们使用哪种呢?

    当确定字符串为定长、数据变更频繁、数据检索需求少时,使用char;

    当不确定字符串长度、对数据的变更少、查询频繁时,使用varchar。

    5.解释什么是队列(queue),栈(stack),有何区别,php哪些数组结合可以实现队列和栈?

    栈(Stack)和队列(Queue)是两种操作受限的线性表。

    栈与队列的相同点

    1.都是线性结构。

    2.插入操作都是限定在表尾进行。

    3.都可以通过顺序结构和链式结构实现。、

    4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

    5.多链栈和多链队列的管理模式可以相同。

    栈与队列的不同点

    1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

    2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

    3.顺序栈能够实现多栈空间共享,而顺序队列不能。

    PHP实现栈和队列:

    array_shift : 删除数组中首个元素,并返回被删除元素的值。

    array_unshift : 在数组开头插入一个或多个元素。

    array_pop:删除数组的最后一个元素(出栈)。

    array_push:将一个或多个元素插入数组的末尾(入栈)。

  • 相关阅读:
    Java关键字instanceof
    java中equals和==的区别
    Servlet、Filter、Listener总结
    struts2 拦截器配置
    Struts2技术详解
    构建Java并发模型框架
    基于MINA框架快速开发网络应用程序
    Spring的IOC原理
    Spring AOP原理及拦截器
    JAVA三大框架SSH和MVC
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453013.html
Copyright © 2020-2023  润新知