[关闭]
@liuximing 2018-02-07T10:06:27.000000Z 字数 2304 阅读 149

PHP碎碎念

PHP


isset() 和 !empty()

变量不存在 false false
变量存在,等于:
NULL
false false
变量存在,等于:
$var; (一个声明了,但是没有值的变量)
'' (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
'0' (作为字符串的0)
FALSE
array() (一个空数组)
true false

==(!=) 和 ===(!==)

==(!=)只比较变量的值

  1. <?php
  2. if ('5' == 5) {
  3. echo "'5'", ' == 5';
  4. }
  5. if ('5' != 5) {
  6. echo "'5'", ' != 5';
  7. }
'5' == 5

===(!==)不仅比较变量的值,还要比较变量的类型

  1. <?php
  2. if ('5' === 5) {
  3. echo "'5'", ' === 5';
  4. }
  5. if ('5' !== 5) {
  6. echo "'5'", ' !== 5';
  7. }
'5' !== 5

PHP的数组都是映射

PHP索引数组(num-value)和关联数组(key-value)本质上都是有序映射,所以它们都可以是离散的。需要注意的是,尽管它们分别对应JSON的数组和对象,但离散后的索引数组转成JSON后也将变成一个对象,除非你试用了array_values()函数。
也正是因为索引数组也支持离散,你才可以在正序循环中删除索引数组中的某些元素并且没有遗漏,否则你不得不倒序循环以实现删除某些元素的功能。

  1. <?php
  2. $a = array(0, 1, 't', 't', 4, 't');
  3. var_dump($a);
  4. foreach ($a as $num => $value) {
  5. if ($value === 't') {
  6. unset($a[$num]);
  7. }
  8. }
  9. var_dump($a);
  1. array(6) {
  2. [0]=>int(0)
  3. [1]=>int(1)
  4. [2]=>string(1) "t"
  5. [3]=>string(1) "t"
  6. [4]=>int(4)
  7. [5]=>string(1) "t"
  8. }
  9. array(3) {
  10. [0]=>int(0)
  11. [1]=>int(1)
  12. [4]=>int(4)
  13. }

看不见的false

PHP的true值等于1,回显也是1,而false值等于0,并且无法回显。

  1. <?php
  2. var_dump(true);
  3. var_dump(false);
  4. echo true;
  5. echo false;
  1. bool(true)
  2. bool(false)
  3. 1

所以,它们不能和字符串类型的“true”或“false”比较。想要比较或者回显“true”或“false”,可以这么做。

  1. <?php
  2. $a = false;
  3. $b = $a ? 'true' : 'false';
  4. echo $b;
  1. false

二维数组的去重

PHP array_unique()函数只支持一维数组去重,要使用array_unique()对二维数组去重,基本思路就是打平—去重—拆开。
如果嵌套的是索引数组:

  1. <?php
  2. foreach ($arrayArray as &$array) {
  3. $array = join(',' $array);
  4. }
  5. $arrayArray = array_unique($arrayArray);
  6. $result = array();
  7. foreach ($arrayArray as $array) {
  8. $result[] = explode(',' $array);
  9. }

如果嵌套的是关联数组:

  1. <?php
  2. foreach ($arrayArray as &$array) {
  3. $array = json_encode($array);
  4. }
  5. $arrayArray = array_unique($arrayArray);
  6. $result = array();
  7. foreach ($arrayArray as $array) {
  8. $result[] = json_decode($array);
  9. }

上面有个陷阱,请注意引用&

  1. <?php
  2. $arr = array(1, 2, 3);
  3. foreach ($arr as &$item) {}
  4. var_dump($arr);
  5. foreach ($arr as $item) {}
  6. var_dump($arr);
  1. array(3) {
  2. [0]=>int(1)
  3. [1]=>int(2)
  4. [2]=>int(3)
  5. }
  6. array(3) {
  7. [0]=>int(1)
  8. [1]=>int(2)
  9. [2]=>int(2)
  10. }

让我们看一下究竟发生了什么:
第一次循环结束之后,arr[2]指向的是同一块内存空间。
第二次循环开始之前,item和arr[0],也就是1
- arr[2]被赋值为item和arr[2],也就是2
然后就没有然后了...


json_encode() 和 json_decode() 中的陷阱

习惯了PHP关联数组的用法,我总是会对json_decode()之后的对象做关联数组操作--#。拜托别再这样了,那里没有关联数组,请用->谢谢。
还干过一件更傻的事,就是搞不清json字符串中为什么部分字段被转义了。好吧,那一定是这个json字符串嵌套了其他json字符串,难道不是吗--!。


require 和 include

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注