分类目录归档:PHP基础

PHP后台上传图片

前台图片上传

比较普遍用这种方式,页面通过form表单来提交,服务端PHP通过$_FILES来接收

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title></title>
 </head>
 <body> 
  <form action="upload.php" method="post" enctype="multipart/form-data">
   图片:<input type="file" name="img"/>
   <input type="submit" value="点击上传"/>
  </form>
 </body>
</html>

我们知道form表单默认是通过application/x-www-urlencoded方式编码传递的。以上form表单指定了通过multipart/form-data的编码方式,支持二进制传输。

那么服务端如果想调用公司平台接口上传呢,下来将进行介绍
继续阅读

堆及堆排序PHP实现

一、什么是堆

堆是一种数据结构,特殊的树形数据结构。常见的堆有二叉堆、二项式堆、斐波拉契堆等。
堆这种数据结构主要用来实现两个功能:堆排序和优先队列。

PHP SPL中有堆这种数据结构(SplHeap),及优先队列(SplPriorityQueue)。

二、细说二叉堆

这里细说的堆排序使用的是二叉堆,那么二叉堆是什么样的呢
二叉堆是一颗完全二叉树(维基百科提到还有可能是近似完全二叉树,很不理解),节点和双亲节点维持着固定的关系,要么节点的值都大于双亲节点,要么节点的值都小于双亲节点,并且每个节点的左右子树都是二叉堆。【完全二叉树及堆的图,可参考知乎专栏,传送门
特点:
0、节点都大于双亲节点的二叉堆叫大顶堆。
1、节点都小于双亲节点的二叉堆叫小顶堆。
2、二叉堆一般用一维数组来存储。
3、二叉堆一个节点的左右孩子没有顺序。
4、有n个元素的二叉堆,最后一个非叶节点为n/2 -1
继续阅读

PHP引用理解之神奇的foreach面试题

最近面试了一些各种背景的同学,发现下面这题鲜有人答出来。题目看起来刁钻,实际上是对引用很好的考察。

一、题目和答案
题目如下(要求写出两次输出的结果):

    $value = ['foo', 'bar', 'cat'];
    foreach($value as &$val) {
        // nothing to do
    }

    var_dump($value);

    foreach($value as $val) {
         // also nothing to do
    }

    var_dump($value);
// the end of the script

继续阅读

PHP保留固定位小数

这个是常用功能了,网上很多文章写的都不完整。特整理。

首先说明,round()函数并不能总是起作用, 故而不能实现本题的要求,比如:

# 不起作用
php -r "echo round(10000, 2), PHP_EOL;" // 10000
# 起作用
php -r "echo round(10000.256, 2), PHP_EOL;" // 10000.26

继续阅读

使用usort排序的通用方法

一、问题描述
先抛出问题,有一个二维数组,有多个维度的字段,需要计算出各个维度单独的排名, 降序排列?
数据简化后如下:

      // 示例数据生成
      for ($i = 0; $i < 100; $i++) {
            $data = [
                'id' => $i,
                'read_count' => mt_rand(100000, 999999),
                'interactive_count' => mt_rand(10000, 99999),
                'search_count' => mt_rand(1000, 9999),
                'video_count' => mt_rand(100, 999),
                'checkin_count' => mt_rand(100, 999),
                'watch_count' => mt_rand(100, 999),
                'score' => mt_rand(60, 90),
                'play_status' => mt_rand(1, 2),
            ];

            $datas[] = $data;
       }

      // 演示例数据
      function getDemoData()
      {
           $datas = [
	        ['id' => 1,'score' => 10, 'read_count' => 1000, 'search_count' => 90],
	        ['id' => 2,'score' => 80, 'read_count' => 300, 'search_count' => 490],
	        ['id' => 3,'score' => 10, 'read_count' => 500, 'search_count' => 590],
           ];
           return $datas;
      }

二、直接的解发
简单粗暴的办法,你必然能想到,如下:
算法:
0、定义一个排序类,每个维度定义一个排序方法
1、对每个维度分别排一次
2、分别记录每个维度的排名
继续阅读

快速了解Composer

PHP依赖管理工具Composer早有耳闻,但是一直没有了解过。最近研究定时任务调度,发现Laravel框架自带定时任务管理功能,处于好奇就想去看看。

之前完全没有接触学习过Laravel, 按照习惯,先下载安装让框架代码跑起来。打开文档发现需要用Composer安装,那就先了解下Composer呗。进入Composer官网发现又是一堆文档,目测10分钟是看不完了。

我的目标是快速安装好Laravel,一边调试一边看任务调度的逻辑,结果第一步就被拖住了,我多么希望有一个简单的极致的说明和用法介绍,于是稍微花费了一些功夫有了下面的整理,希望10分钟内你就能明白。
继续阅读

CSRF跨站请求伪造

上篇文章总结了遇到过的一个XSS漏洞问题,这次顺便写写自己了解的CSRF。

一、简介

CSRF是Cross-site request forgery的缩写,中文的世界一般说法是跨站请求伪造。简单地说,就是黑客伪造了一个目标网站的地址,欺骗用户去点击用浏览器打开这个地址,如果用户登陆了这个网站,就可以绕过后台用户身份验证,执行一些操作。
继续阅读

PHP导出CSV文件及问题总结

第一部分:生成CSV文件,导出/下载文件

0、什么是CSV文件。
CSV(Comma-Separated Values),即逗号分隔值(有时也称为字符分隔值,因为分隔字符也可以不是逗号)。CSV文件是以CSV格式存储表格数据的纯文本文件。
注:Excel可以直接打开CSV文件, 可以另存为Excel文件扩展名xls(Excel 03之前的版本), xlsx(Excel 07之后的版本)。所以一般导出Excel数据的需求,直接导出CSV比较快捷。
继续阅读

PHP二维数组合并排重的两种方式

业务中需要统计一段时间投票独立的用户数,涉及到数组的排重,用传统array_unique()发现,当数据量达到百万级后, 设置的1G内存都耗尽了,仍然没有统计完。而用array_flip()发现不仅可以统计出来,而且更快。

之前这两种方式没有比较过,数据量小的时候也没有遇到问题,发现差异,一直混用。特记录下两种方式。
继续阅读