1.php数组指针
$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]到 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() 的一个简单比较
<?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引用) 下面的结果是否能正常打印,为啥
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)下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
<?php
$tmp = 0 == "a"? 1: 2;
echo $tmp;
?>
结果是: 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 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
<?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扩展
$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 ])
// 表达式 (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
<?php
$a = 1.23456789;
$b = 1.23456780;
$precision = 5;
if(bccomp($a, $b, $precision) === 0 ) {
echo "true";
} // true
?>
<?php
$a = sprintf('%.17f', 0.1+0.2);
$b = 0.3;
if(bccomp($a, $b, 17) !== 0 ) {
echo "FALSE";
} // FALSE
?>