PHP多维数组 这20道php题,让我有点慌,你值得深思
发布时间:2023-01-12 11:23:36 所属栏目:PHP教程 来源:
导读: 学习与交流:PHP面试分享与交流群
文章所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作。
1 考查:优先级
echo?
文章所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作。
1 考查:优先级
echo?
|
学习与交流:PHP面试分享与交流群 文章所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作。 1 考查:优先级 echo?-10%3; ?> 答案:-1。 考查:优先级。 因为-的优先级比%求余的优先级低,也就是-(10%3)。 2 pow函数与整型的用法 print?(int)pow(2,32); 答案:0 考查:pow函数的用法 定义:pow() 函数返回 x 的 y 次方。这里答案为0,是指32位平台下超过了int的范围,print出来的为false,将转为0. 3 考查:返回值 //file1.php $a?=?'123'; ?> //file2.php echo?include('file1.php'); ?> 答案:1. 考查:返回值。 因include()也是一个函数,有返回值。在成功时返回1,失败时返回错误信息。如果被包含的文件有return,则inculde()成功时返回该文件的返回值。 4考查:static和++。 $count?=?5; function?get_count()?{ ????static?$count?=?0; ????return?$count++; } ++$count; get_count(); echo?get_count(); ?> 答案:1. 因static $count,所以只在第一次调用get_count的时候对$count赋值为0,第二次再进来这个函数,则不会第二次赋值。其次就是return $count++和return ++$count了,前者先返回,后者先++再返回。 5考查:类型转换。 $arr?=?array(0?=>1,'aa'?=>?2,3,4); foreach($arr?as?$key?=>?$val){ ????print($key?==?'aa'???5?:?$val); } ?> 答案:5534. 因遍历数组第一次的时候,$key和aa的比较实际就是0和aa的比较,一个是int一个是stringPHP多维数组,这个时候会转换类型,将字符串转换为数字再与数字比较。所以0=='aa'就是0==0,所以为true,也就是输出5。虽然PHP是若类型语言,但是人家也有类型的好吗。 6count函数的考查 echo?count($x);??????//输出:0 $a?=?2; echo?count($a);??????//?输出:1 $arr_age?=?array(18,?20,?25); echo?count($arr_age);????//?输出:3 ?> 答案:1,2,3 见注释 原因:int count( mixed var [, int mode] )如果var是非数组的普通变量,则返回 1 ,对于不存在、未初始化或空数组返回 0 。 可选参数mode设为COUNT_RECURSIVE(或 1),count()将递归地对数组计数,这对计算多维数组的所有单元尤其有用,但count()识别不了无限递归。mode 的默认值是 0 。 7、请选择以下代码运行的结果: ? if?('1e3'?==?'1000')? echo?'LOL';? ?> A 无任何输出结果 B LOLC 不执行且报错 解析:1e3 是 科学计数法 实数的指数形式 为1乘以10的三次方,故‘1e3’=='1000’是成立的,输出echo ‘LOL’; 8、请选出以下代码运行的结果: ? $a?=?"aabbzz";? $a++;? echo?$a;? ?> A b B aabbzz C aabcaa 解析:字符串字母相加其实就是在末尾字母加一 如:$a = “a”; a + + ; 答 应 结 果 就 是 b , a++;答应结果就是 b,a++;答应结果就是b,a=’‘aa’;结果就是ab 故a = " a a b b " ; 打 印 结 果 就 是 a a b c , 如 a = "aabb";打印结果就是 aabc ,如a="aabb";打印结果就是aabc,如a = “aabbz”;结果就是 aabca,因为Z是末尾字母故加一变为a,向前一位进一,b就变为c,故结果为C; 9,写出一下程序的输出结果: ??? $data?=?['a','b','c'];? foreach($data?as?$k=>$v){ ????$v?=?&$data[$k]; } > A $data = ['a','b','c']; B $data = ['b','b','c']; C $data = ['b','c','c']; 解析:这里有个考点要记得 就是&是引用;修改引用变量的值,那么空间的值也会改变,第一次循环 得到KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&?data[0]=>‘a’, 第二次循环KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&?data[1]=>‘b’,可见第一次引用的data[0] 的 值 已 经 被 改 变 , 所 以 此 时 的 data[0]的值已经被改变,所以此时的data[0]的值已经被改变,所以此时的data[0]=b,此时v 引 用 的 v引用的v引用的data[1],进入第三次循环 此时$v又变为 KaTeX parse error: Expected 'EOF', got '&' at position 3: v=&?data[2]=>‘c’,v 又 一 次 改 变 , 引 用 的 v又一次改变,引用的v又一次改变,引用的data[1]的值也被改变为C,所以此时的$data[1]=c,这样循环结束 $data[0]=>‘b’, $data[1]=>‘c’, $data[2]=>‘c’, 10,写出一下程序的输出结果: ? $a=?0.1;? b?=?0.7?;? if(a+$b?==0.8){? ????echo?true;? }else{? ????echo?false;? }? ?> A 空; B true; C false; D、1;E、0;F:报错 解析:这里的考点有两个:1,echo false和true的值;2、浮点类型不能用于精确计算;首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有一定的损耗,故它无限接近于0.8,也就是0.79999999…,所以echo 应该是个false;echo false;结果是空;echo true;结果是1; 11,以下表达式的结果是: $a=?0; $b=?0; if($a=?3>0?||?$b=?3>0){ ????$a++; ????$b++; } echo?$a,$b; A报错;B:1,1;(要是真的只有两个选项该多好肯定大家都选B) 解析:此题考查的是运算符的优先级问题,首先在此题中比较运算符>逻辑运算符>赋值,所以1,先看 3>0为true,2,因为是||运算所以后面的b = 3 > 0 形 成 短 路 作 用 , 这 时 的 b=3>0 形成短路作用,这时的b=3>0形成短路作用,这时的a=true,$b=0; 故a + + ; 为 1 ;a++;为1;a++;为1;b++;为1这里解释下布尔类型运算不影响布尔类型结果;但是b = 0 ; b=0;b=0;b++;就改变为1, echo true;结果为1, 12关于弱类型 $str1?=?'yabadabadoo'; $str2?=?'yaba'; if?(strpos($str1,$str2))?{ ????echo?"\""?.?$str1?.?"\"?contains?\""?.?$str2?.?"\""; }?else?{ ????echo?"\""?.?$str1?.?"\"?does?not?contain?\""?.?$str2?.?"\""; } 正确运行的输出结果: "yabadabadoo"?does?not?contain?"yaba" strpos是返回字符串str2在str1的位置,没有找到则返回false然而实际上这次返回了0而在if语句中0也被当作false,所以我们需要对false做类型判断, 正确的代码如下: $str1?=?'yabadabadoo'; $str2?=?'yaba'; if?(strpos($str1,$str2)?!==?false)?{ ????echo?"\""?.?$str1?.?"\"?contains?\""?.?$str2?.?"\""; }?else?{ ????echo?"\""?.?$str1?.?"\"?does?not?contain?\""?.?$str2?.?"\""; } 需要注意的是我们使用了!==,在php 和 JS中=== !==相对== 更为严格需要要求数据类型一致 13下面的输出结果会是怎样? $x?=?5; echo?$x; echo?""; echo?$x+++$x++; echo?""; echo?$x; echo?""; echo?$x---$x--; echo?""; echo?$x; 实际运行结果是 5 11 7 1 5 关于$x++和$x--这个问题其实非常容易遇见,我们只需记住$x++使用最近的值,然后才自增。 运算符的优先级,++是明显高于+,因此先执行++ 再执行 + 。关于运算符的优先级,有的时候我们真的可以通过括号来让我们的程序更让人直观的了解,毕竟代码不光是用于执行的,有的时候或许团队的可读性也是提高效率的一种。 14关于变量的引用; $a?=?'1'; $b?=?&$a; $b?=?"2$b"; 请问$a和$b的值各位多少 部分第一时间会想到$a='1' $b='21',仔细一看$b=&$a,这里$b是变量$a的引用而不是直接 赋值。 15下面是true还是false var_dump(0123?==?123); var_dump('0123'?==?123); var_dump('0123'?===?123); var_dump(0123 == 123);// false,PHP会默认把0123当作8进制来处理,实际转化为10进制就是83,显然这不是相等的。 var_dump('0123' == 123);// true这里php会非常有趣的将'0123'转换成一个数字而且默认去掉了前面的0也就是123==123 var_dump('0123' === 123);// false很显然上面的问题已经说过了数字和字符串类型不一致。 16下面的代码有什么问题吗?输出会是什么,怎样修复它 $referenceTable?=?array(); $referenceTable['val1']?=?array(1,?2); $referenceTable['val2']?=?3; $referenceTable['val3']?=?array(4,?5); $testArray?=?array(); $testArray?=?array_merge($testArray,?$referenceTable['val1']); var_dump($testArray); $testArray?=?array_merge($testArray,?$referenceTable['val2']); var_dump($testArray); $testArray?=?array_merge($testArray,?$referenceTable['val3']); var_dump($testArray); 实际输出如下: array(2)?{?[0]=>?int(1)?[1]=>?int(2)?} NULL NULL 运行的时候你或许还能看到下面的警告 Warning:?array_merge():?Argument?#2?is?not?an?array Warning:?array_merge():?Argument?#1?is?not?an?array array_merge需要传入的参数都是数组,如果不是,则会返回null。 你可以这样修改 $testArray?=?array_merge($testArray,?(array)$referenceTable['val1']); var_dump($testArray); $testArray?=?array_merge($testArray,?(array)$referenceTable['val2']); var_dump($testArray); $testArray?=?array_merge($testArray,?(array)$referenceTable['val3']); var_dump($testArray); 17$x应该是输出什么? $x?=?true?and?false; var_dump($x); 部分同学或许会第一时间想到false,实际上这里依旧是强调运算符的优先级,= 会比 and级别高点,因此等同下面的代码 $x?=?true; true?and?false 答案显而易见。 18经过下面的运算 $x的值应该是多少? $x?=?3?+?"15%"?+?"$25" 答案是18,PHP是会根据上下文实现类型的自动转换 上面的代码我们可以这样理解,如果我们在与字符串进行数学运算,实际php会尽可能将字符串中的数组进行转换,如果是数字开头的话则转换成改数字比如"15%"会变成15,如果不是数字开头则会变成0; 上面的运算类似下面 : $x?=?3?+?15?+?0 19运行下面的代码,$text的值是多少?strlen($text)又会返回什么结果? $text?=?'John?'; $text[10]?=?'Doe'; 上面代码执行完毕后$text = "John D"(John后面会有连续的5个空格) strlen($text)会返回11 $text[10] = "Doe"给某个字符串具体的某个位置具体字符时候,实际只会把D赋给$text. 虽然$text才开始只有5个自负长度,但是php会默认填充空格。这和别的语言有些差别。 20下面的输出结果会是什么 $v?=?1; $m?=?2; $l?=?3; if(?($l?>?$m)?>?$v){ ????echo?"yes"; }else{ ????echo?"no"; } 实际的输出是"no",只要仔细分析就不难得出 $l>$m会转换成1 ,则这个时候再和$m比较。 21 执行下面代码$x会变成什么值呢? $x?=?NULL; if?('0xFF'?==?255)?{ ????$x?=?(int)'0xFF'; } 实际的运行结果是$x=0而不是255. 首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff -> 255. PHP使用is_numeric_string判断字符串是否包含十六进制数字然后进行转换。 但是$x = (int)'0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0 (编辑:PHP编程网 - 钦州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330484号