php 面试例子举例
2015-07-07 11:51
495 查看
1.php数组指针
[code] $array = [1, 2, 3]; echo "<pre>",implode(',', $array),"</pre>"; foreach ($array as &$value) { // var_dump($array); } echo "<pre>",implode(',', $array),"</pre>"; foreach ($array as $value) { // var_dump($array); } echo "<pre>",implode(',', $array),"</pre>";
结果是:
1,2,3
1,2,3
1,2,2
最后一个结果为啥是1,2,2 呢 foreach中的代码启用之后的输出是:
1,2,3
array (size=3)
0 => &int 1
1 => int 2
2 => int 3
array (size=3)
0 => int 1
1 => &int 2
2 => int 3
array (size=3)
0 => int 1
1 => int 2
2 => &int 3
1,2,3
array (size=3)
0 => int 1
1 => int 2
2 => &int 1
array (size=3)
0 => int 1
1 => int 2
2 => &int 2
array (size=3)
0 => int 1
1 => int 2
2 => &int 2
1,2,2
想必大家已经明白了具体解释如下:
我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。
第二个循环开始:
第一步:复制arr[0]到arr[0]到value(注意此时value是value是arr[2]的引用),这时数组变成[1,2,1]
第二步:复制arr[1]到arr[1]到value,这时数组变成[1,2,2]
第三步:复制arr[2]到arr[2]到value,这时数组变成[1,2,2]
考察的知识点:
foreach (array_expression as $value)语法结构
遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 value 并且数组内部的指针向前移一步
php array数组的结构
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型
2.php isset()函数
[code] $test=null; if(isset($test)){ echo "true"; }else{ echo "false"; }
输出结果是:
false
php官网上的解释为:
检测变量是否设置,并且不是 NULL。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE
3.php empty()函数
[code]bool empty ( mixed $var )
empty() 与 isset() 的一个简单比较
[code]<?php $var = 0; // 结果为 true,因为 $var 为空 if (empty($var)) { echo '$var is either 0 or not set at all'; } // 结果为 false,因为 $var 已设置 if (!isset($var)) { echo '$var is not set at all'; } ?>
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”(中间没有空格的)、0、0.0(0后含有一个.也是true,.无论有多少个0返回的都是true) “0”、NULL、FALSE、array()、$var都将被认为是空的,如果 var 为空,则返回 TRUE。
empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))。
4. (php引用) 下面的结果是否能正常打印,为啥
[code]class Config{ private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['temp'] = 'temp'; echo $config->getValues()['temp'];
结果:
会提示错误 Undefined index: temp,不正常的打印,原因是:
在PHP中,除非你显示的指定返回引用,否则对于数组PHP是值返回,也就是数组的拷贝。因此上面代码对返回数组赋值,实际是对拷贝数组进行赋值,非原数组赋值
将 getValues() {} 改成 &getValues() 程序就可以输出了.
5. (Content-Type类型)以下代码运行后服务器输出什么
[code]$.ajax({ url: 'http://my.blog.cn/index.php', method: 'post', data: JSON.stringify({a: "a", b: "b"}), contentType: 'application/json' }); var_dump($_POST);
答案是
array(0){}
解释
PHP仅仅解析Content-Type为 application/x-www-form-urlencoded 或 multipart/form-data的Http请求。之所以这样是因为历史原因,PHP最初实现_POST时,最流行的就是上面两种类型。因此虽说现在有些类型(比如application/json)很流行,但PHP中还是没有去实现自动处理。因为_POST是全局变量,所以更改_POST会全局有效。因此对于Content-Type为 application/json 的请求,我们需要手工去解析json数据,然后修改$_POST变量
$_POST = json_decode(file_get_contents(‘php://input’), true);
file_get_contents 将整个文件读入一个字符串
6. (字符串递增) 以下代码运行的结果是
[code]for ($c = 'a'; $c <= 'z'; $c++) { echo $c; }
单引号换成双引号结果是一样的,
结果
a ~ z aa~ az ya~yz
解释
php中没有char类型,只有string类型,对于’z’ 进行递增 结果是’aa’ (原因是: 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 a=′Z′;a = 'Z'; a++; 将把 $a 变成’AA’可以运行下上面的程序就能找到规律) 对于字符串比较大小,学过C的应该都知道,‘aa’是小于’z’的。这也就解释了为何会有上面的输出结果
如果比较的是纯数字的字符串时,是按数字进行比较的
[code]for ($c = '1'; $c <= '10'; $c++) { echo $c; }
结果是: 1 2 3 4 5 6 7 8 9 10
注意
字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化
[code]<?php echo '== Alphabets ==' . PHP_EOL; $s = 'W'; for ($n=0; $n<10; $n++) { echo ++$s . ' '; } echo PHP_EOL; for ($n=10; $n>0; $n--) { echo (--$s) . ' '; } ?>
结果:
== Alphabets ==
X Y Z AA AB AC AD AE AF AG
AG AG AG AG AG AG AG AG AG AG
7. (字符串转int)下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
[code]<?php $tmp = 0 == "a"? 1: 2; echo $tmp; ?>
结果是: 1 int和string类型强制转换造成的
“字符串非数字”转化为数字之后都是0
“字符串和数字”转化为数字之后是0
“数字和字符串”转化为数字之后是前面的数字
“小数点和数字和字符串”转化为数字之后是0
[code]$aa = (int)'asfa'; $bb = (int)'asdf123'; $cc = (int)'23sdf'; $dd = (int)'.23sdf'; echo "\n $aa \n $bb \n $cc\n $dd \n ";
结果是:
0
0
23
0
上面的代码 字符串用”“或”结果是一样的
php手册解释如下: (语言参考–>运算符–>比较运算符)
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
[code]<?php var_dump ( 0 == "a" ); // 0 == 0 -> true var_dump ( "1" == "01" ); // 1 == 1 -> true var_dump ( "10" == "1e1" ); // 10 == 10 -> true var_dump ( 100 == "1e2" ); // 100 == 100 -> true switch ( "a" ) { case 0 : echo "0" ; break; case "a" : // never reached because "a" is already matched with 0 echo "a" ; break; } ?>
结果:
bool(true)
bool(true)
bool(true)
bool(true)
0
注: php手册2015最新版下载地址 http://download.csdn.net/detail/u010187139/8950643
8. (求解字符串(中文和英文)长度和查找指定的值
问题: 如何求解字符串”中国2北333京欢迎你”的字符数(一个中文是一个字符),并找到第四个字符”北”使用php内置函数, 确保配置中已经打开mbstring扩展
[code]$str3 = '中国2北333京欢迎你'; echo mb_strlen($str3, 'utf-8'), "\n"; echo mb_substr($str3, 3, 1, 'utf-8'), "\n";
结果是:
11
北
注: mb_strlen()和mb_substr()最后的一个参数是可以省略的,如果省略和strlen(),substr()功能一样.
可以参考: http://blog.csdn.net/u010187139/article/details/46872485#t62
9. 运算符的优先级 ( || , =, or)
这三个运算符的优先级是: (逻辑运算符[ && || ]) > (赋值运算符 [ = += -= …] ) > (逻辑运算符[ and xor or ])[code]// 表达式 (false || true) 的结果被赋给 $e // 等同于:($e = (false || true)) $e = false || true ; // 常量 false 被赋给 $f,true 被忽略 // 等同于:(($f = false) or true) $f = false or true ; var_dump ( $e , $f );
结果是:
bool(true)
bool(false)
10. floor类型的的变量比较大小
浮点数的精度有限以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示
例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。
比较可以用bccomp()函数
[code]var_dump(0.8 >(0.1+0.7));//true
[code]<?php $a = 1.23456789; $b = 1.23456780; $precision = 5; if(bccomp($a, $b, $precision) === 0 ) { echo "true"; } // true ?>
[code]<?php $a = sprintf('%.17f', 0.1+0.2); $b = 0.3; if(bccomp($a, $b, 17) !== 0 ) { echo "FALSE"; } // FALSE ?>
相关文章推荐
- 黑马程序员--继承
- 黑马程序员---IO其他流
- 黑马程序员——OC—OC中的面向对象
- 网管的职业有什么可能?
- 黑马程序员——java基础---IO流(第18天)
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 2015年薪资最高的5个IT职业
- Android面试题3之描述下Android的系统架构
- 黑马程序员——C语言之字符串与字符串函数
- 每个Java程序员都应该Follow的10个Twitter账号
- 程序员从初级到高级的蜕变
- WEB前端面试题整理
- 黑马程序员--I/o文件文本读取方式
- PHP笔记——java程序员看懂PHP程序
- 最牛B的编码套路
- 黑马程序员-JAVA基础总结
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 程序员如何像写代码一样找女朋友
- 黑马程序员---OC基础---有、无参方法的声明及实现
- 【剑指Offer学习】【面试题43 : n 个锻子的点数】