一.字符串
1. 字符串的几种表达方式
' " heredoc nowdoc
单引号和双引号的区别:
1.双引号解析变量、\r、\n、\t、\、\$、\八进制、\十六进制
2.单引号只能解析 \
2.字符串的内部存储方式
php的解释器是用c写的,解释器相当于弱编译器。
C语音用指针来标记PHP字符串的起始地址,用长度来表示存储的长度。
struct {
char *val;
int len
} str;
-
常见的函数都是单字节处理方式
-
字节组成的数组可以用【】或{}访问某个字符
-
字符串长度最大2G
-
PHP字符串是二进制安全的。C语言以指针起始标志,以\0为结束位置;PHP以指针起始标志,以len为结束位置。
-
用超出字符串长度的下标写入将会拉长字符串并以空格填充
-
非整型类下标会被转换成整数。向下取余floor。
3.串行化
- serialize()、unserialize() 序列化、反序列化:数组、对象存储转为字符串。
- json_decode() 数组转为字符串
- var_export($item, true) 它和 var_dump() 类似
不同的是其返回的表示是合法的 PHP 代码。 var_export($array, true) 将变量打印出来包括类型记录下来 然后输出,常用于记录日志.数组和对象存到文件中,用include包含进来。
4.字符串编码原理
- 位(bit, b):指二进制中的一位,是二进制最小信息单位。
- 字节(Byte, B):是计算机信息技术用于计量存储容量的一种计量单位。
- 字符:是计算机中使用的字母、数字、汉字和符号等等。
- 字符集:就是字符的集合。如:ASCII、GB2312、BIG5、 GBK、Unicode等。
- 字符编码:是把字符集到二进制的存储方式。采用区位码(94*94)
- ASICC ---- 英文
- Latin1 — ASICC的扩展
- GBK — 中文(2312的扩展)
- GB2312 — 中文
- BIG5 — 中文(繁体)
- Unicode — UTF-8
二.数组
1.数组key和value的限制条件
$array = array(
1 => 'a',
"1" => 'b',
1.5 => 'c',
true => 'd'
);
print_r($array); // Array ( [1] => d )
$array = array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-100 => 100
);
print_r($array);
// Array (
// [foo] => bar
// [bar] => foo
// [100] => -100
// [-100] => 100
// )
- key可以是integer或者string
- value 可以是任意类型
- key会有如下强制转换
- 包含有合法整型值得字符串会被转换为整型
- 浮点数和布尔值也会被转换为整型
- 键名null实际会被存储为“”
- 数组和对象不能被用为键名
- 相同键名,之前会被覆盖
2.数组元素的删除unset
$array = [1, 2, 3];
foreach ($array as $key => $value) {
unset($array[$key]);
}
$array[] = 4;
print_r($array); // Array ( [3] => 4 )
3. PHP数组类型与其他类型的转换
<?php
$int = 1;
$string = 'abc';
$float = 2.345;
$false = false;
$true = true;
$arr = (array) $int;
var_dump($arr); // array(1) { [0] => int(1) }
$arr = (array) $string;
var_dump($arr); // array(1) { [0] => string(3) "abc" }
$arr = (array) $float;
var_dump($arr); // array(1) { [0] => double(2.345) }
$arr = (array) $false;
var_dump($arr); // array(1) { [0] => bool(false) }
$arr = (array) $true;
var_dump($arr); // array(1) { [0] => bool(true) }
$arr = (array) null;
var_dump($arr); // array(0) { }
4.数组的遍历
- for 语句循环遍历
- foreach 循环遍历
- while
- array_walk、array_map :回调遍历
- current和next
- foreach遍历中的顺序
$arr[2] = 3;
$arr[1] = 2;
$arr[0] = 1;
foreach ($arr as $key => $value) {
echo $value;
}
// 321
- foreach 遍历中的引用
$arr = array(1, 2, 3);
foreach ($arr as &$value) {}
foreach ($arr as $value) {
echo $value;
}
// 122
/*
* 第一次foreach循环
* 循环1:$v = &$arr[0] = 1;
* 循环2:$v = &$arr[1] = 2;
* 循环3:$v = &$arr[2] = 3;
* 第二次循环
* 循环1:$v = &$arr[2] = $arr[0] = 1; 此时$arr[2] = 1
* 循环2:$v = &$arr[2] = $arr[1] = 2; 此时$arr[2] = 2
* 循环3:$v = &$arr[2] = $arr[2] = 2;
*/
5.数组的存储方式
key值通过hash函数,建立hashTable,映射到内存中。
6.数组的排序
- 申请n个额外的空间(n是数组元素个数)
- 然后遍历双链表,将双链表的每个节点存储到临时空间
- 调用排序函数zend_qsort(内存快速排序算法)对数组进行排序
- 排序之后,双链表中节点的位置发生了变化,因而需要调整指针的指向
- 遍历数组,分别设置每一个节点的pListLast和pListNext
- 最后设置HashTable和pListTail