PHP
- 推荐链接
- 基础代码
- 运算符(必知)
- 函数方法(必知)
- 过滤数组中的元素,只保留符合指定条件的元素【array_filter()】
- 返回输入数组中某个单一列的值。【array_column()和array_multisort()】
- 字符串替换【str_replace()】
- 数组结果集分页 【array_slice()】
- 当前日期或指定日期加一年,加上一个月,加一周,加一天,一分一秒
- PHP延迟执行
- PHP返回数据到控制台
- PHP保留小数点
- PHP数字补零
- PHP数组转字符串(属性加单(双)引号,逗号分隔)
- 二维数组里面添加或删除同样的字段
- microtime获取当前的时间戳和微秒数,以便进行性能测量和计时操作。
- json_decode()和json_encode()
- PHP 数组转化为 JSON 字符串
- 解析前端传过来的序列化的表单数据
- file_exists()函数不能检测包含中文的文件名的解决办法
- PHP 在服务器下载文件传输到客户端
- 查看数据库会话下面事务具体办法 (SQLserver)
- 导入数据时候数字太小导致变成科学计数法
- 树形组件
- 迭代添加数据
- 以哈希表(HashMap)的方式去操作二维数组
推荐链接
基础代码
运算符(必知)
数据在内存中是以二进制的形式存放的,计算机存储数据的最小单位是位(bit),一个二进制位可以表示两种状态(0和1),一个字节通常由8位二进制位组成。
按位与 & (and)
0&0=0 0&1=0 1&0=0 1&1=1
$a = 5; // 二进制表示为 0101
$b = 3; // 二进制表示为 0011
$result = $a & $b; // 二进制计算: 0101 & 0011 = 0001
echo $result; // 输出结果为 1
函数方法(必知)
count():用于计算数组中的元素数量。
array_push():将一个或多个元素添加到数组末尾。
array_pop():从数组末尾移除并返回最后一个元素。
array_shift():从数组开头移除并返回第一个元素。
array_unshift():在数组开头插入一个或多个元素。
array_merge():将一个或多个数组合并为一个数组。
array_slice():从数组中提取指定范围的元素。
array_splice():从数组中删除或替换指定范围的元素,并在其位置插入新元素。
array_search():在数组中搜索指定值,并返回对应的键名。
in_array():检查数组中是否存在指定值。
array_key_exists():检查数组中是否存在指定键名。
array_keys():返回数组中所有键名组成的新数组。
array_values():返回数组中所有值组成的新数组。
array_unique():移除数组中的重复值,返回新数组。
array_flip():交换数组中的键和值。
array_reverse():反转数组中的元素顺序。
array_filter():根据指定条件过滤数组中的元素。
array_map():将指定函数应用于数组的每个元素,并返回结果数组。
array_reduce():通过指定函数对数组进行迭代归约,返回单个值。
sort():对数组进行升序排序。
rsort():对数组进行降序排序。
asort():根据值进行升序排序,并保留键值关联。
ksort():根据键名进行升序排序,并保留键值关联。
array_rand():从数组中随机选择一个或多个键,并返回。
shuffle():随机打乱数组中的元素顺序。
strpos();在字符串中查找子字符串的位置(即子字符串第一次出现的位置)(从0开始计数)。它返回子字符串在字符串中的索引位置,如果未找到子字符串,则返回 false。
过滤数组中的元素,只保留符合指定条件的元素【array_filter()】
$array = array(1, 15, 5, 30, 10, 8);
$result = array_filter($array, function($value) {
return $value > 10;
});
print_r($result);
Array
(
[1] => 15
[3] => 30
)
返回输入数组中某个单一列的值。【array_column()和array_multisort()】
array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。
$students = array(
array('name' => 'Alice', 'age' => 18, 'score' => 78),
array('name' => 'Bob', 'age' => 19, 'score' => 56),
array('name' => 'Charlie', 'age' => 20, 'score' => 89),
);
// 使用 array_column() 函数获取成绩列
$scores = array_column($students, 'score');
// 使用 array_multisort() 函数排序成绩列,并同时排序其他列
array_multisort($scores, SORT_DESC, $students);
字符串替换【str_replace()】
str_replace()是一个字符串替换函数,它可以在一个字符串中查找指定的子串,并将其替换成另一个子串。
将变量 $StartDate 中所有双引号替换成单引号,并将替换后的结果重新赋值给 $StartDate 变量
$StartDate = str_replace("\"","'",$StartDate);
数组结果集分页 【array_slice()】
array_slice(array,start,length,preserve)
$array:要提取元素的数组。
$offset:开始提取的位置索引。如果是负数,则表示从末尾开始计算。
$length(可选):要提取的元素数量。如果未指定,则提取从 $offset 开始到数组末尾的所有元素。
$preserve_keys(可选):是否保留原始数组的键名。默认为 false,即按顺序重新索引数组的键名。
$count = count($article);//总条数
$start=($page-1)*$pagesize;//偏移量,当前页-1乘以每页显示条数
$article = array_slice($article,$start,$pagesize);
当前日期或指定日期加一年,加上一个月,加一周,加一天,一分一秒
<?php
echo date('Y-m-d H:i:s',strtotime('now'));//当前时间戳 2017-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1second'));//当前时间戳+1秒 2017-01-09 21:04:12
echo date('Y-m-d H:i:s',strtotime('+1minute'));//当前时间戳+1分 2017-01-09 21:05:11
echo date('Y-m-d H:i:s',strtotime('+1hour'));//当前时间戳+1小时 2017-01-09 22:04:11
echo date('Y-m-d H:i:s',strtotime('+1day'));//当前时间戳+1天 2017-01-10 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1week'));//当前时间戳+1周 2017-01-16 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1month'));//当前时间戳+1月 2017-02-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1year'));//当前时间戳+1年 2018-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+12year 12month 12day 12hour 12minute 12second'));//当前时间戳+12年,12月,12天,12小时,12分,12秒 2030-01-22 09:16:23
$t=1483967416;//指定时间戳
echo $dt=date('Y-m-d H:i:s',$t);//2017-01-09 21:10:16
/*方法一*/
echo date('Y-m-d H:i:s',$t+1*24*60*60);//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',$t+365*24*60*60);//指定时间戳+1年 2018-01-09 21:10:16
/*方法二*/
//$dt是指定时间戳格式化后的日期
echo date('Y-m-d H:i:s',strtotime("$dt+1day"));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("$dt+1year"));//指定时间戳+1年 2018-01-09 21:10:16
/*方法三*/
//$t是指定时间戳
echo date('Y-m-d H:i:s',strtotime("+1day",$t));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("+1year",$t));//指定时间戳+1年 2018-01-09 21:10:16
//指定时间戳加1月、1周、1小时、1分、1秒原理同上;
PHP延迟执行
usleep() 函数会暂停指定的微秒数。
sleep() 函数会暂停指定的秒数。
//usleep()函数
echo date('h:i:s') . "<br />";
//延迟 10 秒
usleep(10000000);
//再次开始
echo date('h:i:s');
输出显示:
09:23:14
09:23:24
//sleep() 函数
echo date('h:i:s') . "<br>";
//延迟 5秒
sleep(5);
echo date('h:i:s');
输出显示:
09:23:14
09:23:19
PHP返回数据到控制台
public function console_log($data)
{
if (is_array($data) || is_object($data))
{
echo("<script>console.log('".json_encode($data)."');</script>");
}
else
{
echo("<script>console.log('".$data."');</script>");
}
}
PHP保留小数点
$num = 1234.61;
//第一种,使用round()对小数进行四舍五入
$format_num = round($num,2);
echo $format_num ; // 1234.61
//第二种,使用sprintf()格式化字符串
$format_num = sprintf("%.2f",$num);
echo $format_num; //1234.61
//第三种,使用number_format千分位组来格式化数字函数
$format_num = number_format($num,2);
echo $format_num; //1,234.61
!!!注意!number_format格式化大于1000的数字时会将数字分千位组,例如12314 // 12,314
这样的是不能被数据库浮点型识别的
PHP数字补零
str_pad()
顾名思义这个函数是针对字符串来说的这个可以对指定的字符串填补任何其它的字符串
例如:str_pad(带填补的字符串,填补后的长度,填补字符串,填补位置)
其中填补后的长度必须是个正整数,填补位置有三个选项,
左边:STR_PAD_LEFT,
右边:STR_PAD_RIGHT,
两端:STR_PAD_BOTH
echo str_pad(1,8,"0",STR_PAD_LEFT);
结果:00000001
echo str_pad(1,8,"0",STR_PAD_RIGHT);
结果:10000000
echo str_pad(1,8,"0",STR_PAD_BOTH);
结果:00010000
在上边的例子中值得注意的一个细节是,如果填补的位数是个奇数,例如例三中填补了7个0,右边优先。
sprintf()
echo sprintf("%05d",1);
先说%05d的意思,用一个5位数的数字格式化后边的参数,如果不足5位就补零
运行结果是00005
小数点后补零
echo sprintf("%01.3f",1);
%01.3f的意思是说,用一个小数点后最少三位不足三位补零,小数点前最少一位,不足一位补零的浮点数格式化后边的参数
其运行结果是:1.000
PHP数组转字符串(属性加单(双)引号,逗号分隔)
//join或implode
//join() 函数是 implode() 函数的别名,推荐使用implode
//implode(',', array_values($data) );
$str = " ' " . implode("','", array_values($data) ) . " ' ";
//str_replace
$str = " ' ".str_replace( ",","','", implode(',',$data)); //使用需要的符号替换
//array_map 函数式实现
$str = join( ', ',array_map(function( $v ){ return "'".$v."'";},$data) ); //使用函数拼接
二维数组里面添加或删除同样的字段
$add = ['str'=>1];
$arr = [
['id'=>1, 'name'=>'aaa'],
['id'=>2, 'name'=>'1aaa'],
];
// 二维数组追加字段给所有数组追加
// 二维数组也可以删除想要的键
array_walk($arr,function(&$value,$k,$add){
$value = array_merge($value, $add);
}, $add);
dd($arr);
microtime获取当前的时间戳和微秒数,以便进行性能测量和计时操作。
$startTime = microtime(true);
// 执行一些代码
$endTime = microtime(true);
$executionTime = $endTime - $startTime;
echo "执行时间:" . $executionTime . " 秒";
json_decode()和json_encode()
/*json_decode() 用于将 JSON 字符串解码为 PHP 对象或数组。
它的语法是:json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0).
$json 参数是要解码的 JSON 字符串。
$assoc 参数是一个可选参数,用于指定是否将解码后的 JSON 转换为关联数组。默认为 false,表示返回一个对象。如果设置为 true,则返回关联数组。
$depth 参数是一个可选参数,用于指定解码的最大深度,默认为 512。
$options 参数是一个可选参数,用于提供额外的解码选项。
json_decode() 函数将解码后的结果返回为 PHP 对象或数组,具体取决于 $assoc 参数的设置。如果解码失败,则返回 null。
json_encode() 函数:
*/
$jsonString = '[{
"TaskName": "",
"SerialNo": ,
"EmpID": "",
"EmpName": ""
},
{
"TaskName": "",
"SerialNo": ,
"EmpID": "",
"EmpName": ""
}
]';
$array = json_decode($jsonString, true);
print_r($array);
/*
json_encode() 用于将 PHP 对象或数组编码为 JSON 字符串。
它的语法是:json_encode(mixed $value, int $options = 0, int $depth = 512).
$value 参数是要编码为 JSON 的 PHP 对象或数组。
$options 参数是一个可选参数,用于提供编码选项。
$depth 参数是一个可选参数,用于指定编码的最大深度,默认为 512。
json_encode() 函数将编码后的 JSON 字符串作为结果返回。
*/
PHP 数组转化为 JSON 字符串
// 在 PHP 中将数组转化为 JSON 字符串
//JSON_UNESCAPED_UNICODE 参数用于确保生成的 JSON 字符串中的非 ASCII 字符不会被转义。然后,将生成的 JSON 字符串赋值给 jsonData 变量,并使用 JSON.parse() 函数将其解析为 JavaScript 对象或数组。
var jsonData = '<?php echo json_encode($value, JSON_UNESCAPED_UNICODE); ?>';
//var jsonData = "<?php echo json_encode($value); ?>";
// 在 JavaScript 中将 JSON 字符串转化为对象或数组
var rawData = JSON.parse(jsonData);
console.log(rawData);
解析前端传过来的序列化的表单数据
//前端通过 $('form').serialize() 序列化的表单数据传递到后端
$dataString = $data['form']; // 获取包含 URL 参数的字符串
// 解码 URL 参数字符串
$dataString = urldecode($dataString);
// 创建一个空数组来存储解析后的数据
$parsedData = array();
// 解析 URL 参数字符串为关联数组
parse_str($dataString, $parsedData);
// 打印解析后的结果
var_dump($parsedData);
file_exists()函数不能检测包含中文的文件名的解决办法
仅仅对文件名进行转码也不行,需要把【路径+文件名】一起转码才可以,只要把文件路径与文件名字从UTF8编码转换为GB2312编码,改进后就可以准确判断了
$file='../uploads/file/中文.pdf'; //在../uploads/file/文件夹中 中文.pdf 实际存在
$file=iconv('UTF-8','GB2312',$file);
echo file_exists($file); //输出为true
PHP 在服务器下载文件传输到客户端
// 如果下载出错,需要注意编码格式,并且可以在相同位置创建名称大小都单一的文本文件进行测试,最后要注意多看日志。
$eFilePath = 'E:/wamp64/www/nipponlaw/Public/'.I('get.url'); // E盘实际文件路径
if (file_exists(iconv('UTF-8','GB2312',$eFilePath))) {
// 设置下载头信息
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($eFilePath));
readfile(iconv('UTF-8','GB2312',$eFilePath));
} else {
var_dump("当前文件不存在");die;
}
查看数据库会话下面事务具体办法 (SQLserver)
//获取当前连接的会话ID
$sql = "SELECT @@SPID AS session_id";
$sessionInfo = Db::query($sql);
$sessionId = $sessionInfo['0']['session_id'];
// 查询sys.dm_exec_requests视图,获取当前会话的信息
$sql = "SELECT * FROM sys.dm_exec_requests WHERE session_id = {$sessionId}";
$sessionInfo = Db::query($sql);
// 获取事务ID
$transactionId = $sessionInfo['0']['transaction_id'];
// 查询sys.dm_tran_session_transactions视图,获取与当前会话相关的事务信息
$sql = "SELECT * FROM sys.dm_tran_session_transactions WHERE session_id = {$sessionId}";
$transactions = Db::query($sql);
// 统计事务数
$transactionCount = count($transactions);
echo "当前会话中的事务数为:{$transactionCount}"; // 输出事务数
导入数据时候数字太小导致变成科学计数法
/**
* 将科学计数法的数字转换为正常的数字
* 为了将数字处理完美一些,使用部分正则是可以接受的
*/
public function convert_scientific_number_to_normal($number)
{
if(stripos($number, 'e') === false) {
//判断是否为科学计数法
return $number;
}
if(!preg_match("/^([\\d.]+)[eE]([\\d\\-\\+]+)$/",str_replace(array(" ", ","), "", trim($number)), $matches))
{
//提取科学计数法中有效的数据,无法处理则直接返回
return $number;
}
//对数字前后的0和点进行处理,防止数据干扰,实际上正确的科学计数法没有这个问题
$data = preg_replace(array("/^[0]+/"), "", rtrim($matches[1], "0."));
$length = (int)$matches[2];
if($data[0] == ".") {
//由于最前面的0可能被替换掉了,这里是小数要将0补齐
$data = "0{$data}";
}
//这里有一种特殊可能,无需处理
if($length == 0) {
return $data;
}
//记住当前小数点的位置,用于判断左右移动
$dot_position = strpos($data, ".");
if($dot_position === false) {
$dot_position = strlen($data);
}
//正式数据处理中,是不需要点号的,最后输出时会添加上去
$data = str_replace(".", "", $data);
if($length > 0) {
//如果科学计数长度大于0
//获取要添加0的个数,并在数据后面补充
$repeat_length = $length - (strlen($data) - $dot_position);
if($repeat_length > 0) {
$data .= str_repeat('0', $repeat_length);
}
//小数点向后移n位
$dot_position += $length;
$data = ltrim(substr($data, 0, $dot_position), "0").".".substr($data, $dot_position);
} elseif($length < 0) {
//当前是一个负数
//获取要重复的0的个数
$repeat_length = abs($length) - $dot_position;
if($repeat_length > 0) {
//这里的值可能是小于0的数,由于小数点过长
$data = str_repeat('0', $repeat_length).$data;
}
$dot_position += $length;//此处length为负数,直接操作
if($dot_position < 1) {
//补充数据处理,如果当前位置小于0则表示无需处理,直接补小数点即可
$data = ".{$data}";
} else {
$data = substr($data, 0, $dot_position).".".substr($data, $dot_position);
}
}
if($data[0] == ".") {
//数据补0
$data = "0{$data}";
}
return trim($data, ".");
}
树形组件
// 树形组件1
public function trueAll2($data,$pid){
$result = array();
foreach ($data as $k => $v) {
if ($v['PID'] == $pid) {
$tree['title'] = $v['title'];
$tree['ID'] = $v['ID'];
$tree['PID'] = $v['PID'];
$tree['OrganizationCode'] = $v['OrganizationCode'];
$tree['OrganizationLevel'] = $v['OrganizationLevel'];
$tree['children'] = $this->trueAll2($data, $v['ID']);
if (empty($tree['children'])){
unset($tree['children']);
}
$result[] = $tree;
}
}
return $result;
}
迭代添加数据
$num = 100;
$limit = ceil(count($structureData)/$num);
for ($i = 1;$i<=$limit;$i++){
$offset = ($i-1)*$num;
$dataALL = array_slice($structureData,$offset,$num);
Db::table('表名')->insertAll($dataALL);
}
以哈希表(HashMap)的方式去操作二维数组
$hashMap = [];
foreach ($array1 as &$item2) {
$key = $item2['key'];
$hashMap[$key] = $item2;
}
foreach ($result as &$item1) {
$key = $item1['key'];
if (isset($hashMap[$key])) {
$item1['value'] = 0.00;
}
}