each 1 2 amp 3 php,php 面试例子举例

1.php数组指针

$array = [1, 2, 3];

echo "

",implode(',', $array),"
";

foreach ($array as &$value) {

// var_dump($array);

}

echo "

",implode(',', $array),"
";

foreach ($array as $value) {

// var_dump($array);

}

echo "

",implode(',', $array),"
";

结果是:

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]到value(注意此时value是arr[2]的引用),这时数组变成[1,2,1]

第二步:复制arr[1]到value,这时数组变成[1,2,2]

第三步:复制arr[2]到value,这时数组变成[1,2,2]

考察的知识点:

foreach (array_expression as $value)语法结构

遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 value 并且数组内部的指针向前移一步

php array数组的结构

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型

2.php isset()函数

$test=null;

if(isset($test)){

echo "true";

}else{

echo "false";

}

输出结果是:

false

php官网上的解释为:

检测变量是否设置,并且不是 NULL。

若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE

3.php empty()函数

bool empty ( mixed $var )

empty() 与 isset() 的一个简单比较

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”(中间没有空格的)、0、0.0(0后含有一个.也是true,.无论有多少个0返回的都是true) “0”、NULL、FALSE、array()、$var都将被认为是空的,如果 var 为空,则返回 TRUE。

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))。

4. (php引用) 下面的结果是否能正常打印,为啥

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类型)以下代码运行后服务器输出什么

$.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. (字符串递增) 以下代码运行的结果是

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++; 将把 $a 变成’AA’可以运行下上面的程序就能找到规律) 对于字符串比较大小,学过C的应该都知道,‘aa’是小于’z’的。这也就解释了为何会有上面的输出结果

如果比较的是纯数字的字符串时,是按数字进行比较的

for ($c = '1'; $c <= '10'; $c++) {

echo $c;

}

结果是: 1 2 3 4 5 6 7 8 9 10

注意

字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化

<?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)下面程序的输出结果, 简要说明为什么, 如何解决这类问题?

结果是: 1 int和string类型强制转换造成的

“字符串非数字”转化为数字之后都是0

“字符串和数字”转化为数字之后是0

“数字和字符串”转化为数字之后是前面的数字

“小数点和数字和字符串”转化为数字之后是0

$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 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

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扩展

$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://www.voidcn.com/article/p-dklsmcsz-nn.html

9. 运算符的优先级 ( || , =, or)

这三个运算符的优先级是: (逻辑运算符[ && || ]) > (赋值运算符 [ = += -= …] ) > (逻辑运算符[ and xor or ])

// 表达式 (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()函数

var_dump(0.8 >(0.1+0.7));//true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值