加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 钦州站长网 (https://www.0777zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP多维数组 这20道php题,让我有点慌,你值得深思

发布时间:2023-01-12 11:23:36 所属栏目:PHP教程 来源:
导读:  学习与交流:PHP面试分享与交流群

  文章所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作。

  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编程网 - 钦州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!