您的位置:首页 > 职场人生

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
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: