count 计数
count( $array, [ $mode = COUNT_NORMAL ] )
COUNT_NORMAL = 0,普通模式
COUNT_RECURSIVE = 1,递归模式,统计多维数组所有单元特殊值的计数
count(null); // 0 count(false); // 1
数组定义相同键名问题
1、 键名相同,后者会覆盖前者
2、 数字键名,有无引号的代表相同键名
$a = array(
1 => 'a',
'1' => 'b',
4 => 'c',
'04' => 'e'
);
print_r($a);
# 输出结果:
#
# Array
# (
# [1] => b
# [4] => c
# [04] => e
# )
数组间操作 + 与 array_merge 的区别
- “+” 数组相加,键名相同取优先出现的值,元素总数可能会减少
$a = array( 1 => 'a', '1' => 'b', 4 => 'c' ); $b = array( 2 => 'd', 4 => 'e' ); print_r( $a + $b ); # 输出结果 # # Array # ( # [1] => b # [4] => c # [2] => d # )
- array_merge 数组合并,非数字键名后面的覆盖前面的,数字键名的元素个数不变,按出现顺序重新编号
$a = array( 1 => 'a', '1' => 'b', 4 => 'c', '04' => 'd' ); $b = array( 2 => 'e', '04' => 'f', 4 => 'g', '40' => 'h' ); print_r( array_merge( $a, $b ) ); # 输出结果 # # Array # ( # [0] => b # [1] => c # [04] => f # [2] => e # [3] => g # [4] => h # )
浮点数的比较
PHP 通常使用 IEEE 754 双精度格式,同 js
有些浮点数无法用二进制位准确表示,会产生误差,当进行复合运算时,误差可能会积累
IEEE 754 浮点数的表示可参考 揭秘 0.1 + 0.2 != 0.3
边界值 intval()
、 (int)
- 32位系统下,边界值是-2147483648到2147483647
- 64位系统下,边界值是-9223372036854775808到9223372036854775807
- 对于超过边界值的数值进行上述函数操作,会得到错误的结果
- 在
mysql
中,字段中也要注意边界值问题
实例化一个空类 StdClass
$emptyClass = new StdClass();
stdClass
类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法
算数运算注意
求余
%
结果的符号
结果的符号和被求除数的符号相同,被除数和除数不是整数的,先被自动取整。-5 % 3; // -2 -5.9 % 3.2; // -2
除法
/
结果是否是浮点数问题
除法的结果是浮点数,除非能够整除1/2; // 0.5 0.5 / 0.25; // 0.2
幂运算
**
**
的优先级在所有的运算符中最高3**2; // 9 2**1/2; // 1 2**(1/2); // 1.4142135623731
自然对数
e
为底的指数运算exp
echo exp(1); // 2.718281828459045
位操作运算符
&
按位与
|
按位或
^
按位异或
~
按位取反
<<
按位左移
>>
按位右移运算优先级
好用的PHP函数
array_map( <函数名>, <数组> )
将函数作用在数组的每一个值上面,返回带有新值的数组
有多个数组输入时,返回各小数组组成的大数组array_map( 'strtoupper', array( 'a' => 'hello', 'b' => 'world' ) ); #Array #( # [a] => HELLO # [b] => WORLD #)
array_reverse( <数组>, [ $preserve = true ] )
将原数组中的元素顺序翻转,创建新的数组并返回
$preserve 是否保留原有键名array_reverse( array( 'a' => 1, 'b' => 2 ) ); #Array #( # [b] => 2 # [a] => 1 #)
array_walk( <数组>, <回调>, [ 可选参数 ] )
依次对数组的元素进行回调
@param <数组>取地址
@param <回调>第一个参数为 item,第二个为 key
@param [可选参数]会作为回调的第三个参数传递过去
@return bool 操作成功则返回true
注:不受<数组>内部指针的影响,顺序遍历不会遗漏function test( $item, $key, $prefix ){ echo $prefix.':'.$key.':'.$item."\n"; } array_walk( [ 'a' => 'apple', 'g' => 'google' ], 'test', 'company' ); #company:a:apple #company:b:google
call_user_func
&call_user_func_array
call_user_func( <回调函数>, [参数1], [参数2] )
call_user_func_array( <回调函数>, [参数数组] )
二者的区别在于:
① 前者参数不能引用传值,而后者可以
② 后者参数是数组call_user_func('回调函数名'); call_user_func(__NAMESPACE__ .'\类名::方法名'); call_user_func(array(__NAMESPACE__ .'\类名', '方法名')); call_user_func(<类的实例> .'::方法名'); call_user_func(array(<类的实例>, '方法名')); call_user_func(<函数变量>)