PHP函数深入理解

一.字符串

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值