月度归档:2019年04月

使用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、分别记录每个维度的排名
继续阅读

PHP静态变量用法

静态变量,static variable。下面这句话非常重要: 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

具体例子可参考官网。下面给出生产环境的用法:
一、区分项目
在基础目录新增一个Util.php文件

<?php
/**
 * 功能介绍 工具方法
 *
 * @author:   chuanbo7 <salmonl@niliu.me>
 * @date:     2019-04-19
 */

// set app标示
function appFlagSet($flag, $get = false)
{
    static $app_flag = ' ';
    if ($get === true) {
        return $app_flag;
    }
    $app_flag = $flag;
}

// get app标示
function appFlagGet()
{
    return appFlagSet('', true);
}

// the end of the script

用法:
0、在项目入口文件index.php中引入这个文件
1、在项目路由中区分项目,分别调用appFlagSet()写入不同的标示。

$uri = $request->getRequestUri();
if ($uri == 'episode') {
    appFlagSet(EPISODE);
} elseif ($uri == 'variety') {
    appFlagSet(VRRIETY);
}

2、在项目中任何地方调用appFlagGet()获取项目标示。
3、思考:如果是单纯的标示,使用$GLOBALS[‘app_flag’] = EPISODE;也可以达到目的。

二、项目记录Debug和执行时间
0、在基础目录新增一个Util.php文件

<?php
//打时间标记, $flag 为标记名,默认为_default
function flagtime($flag = '_default') {
    static $static_time = array();
    if (!isset($static_time[$flag])) {
        $static_time[$flag] = microtime(true);
    }
    $diff = microtime(true) - $static_time[$flag];
    $static_time[$flag] = microtime(true);

    return substr(($diff * 1000) , 0, 5) . 'ms';
}

//存debug信息
function debugSet($string, $get = false) {
    if (!DEBUG)
    return '';
    static $debug_data = array();
    if ($get === true) {

        return $debug_data;
    }
    if (DEBUG) {
        $d = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
        $file = isset($d[0]['file']) ? basename($d[0]['file']) : 'unknown';
        $line = isset($d[0]['line']) ? $d[0]['line'] : 'unknown';
        $debug_data[] = $file . '(line ' . $line . '): ' . $string;
    }
}
//取debug信息
function debugGet() {

    return debugSet('', true);
}

1、在入口和出口分别调用flagtime(),获取项目执行时间。
2、获取请求url执行时间,在请求前后记录

// 请求前
flagtime(1);
// 请求结束
debugSet('{Curl(' . flagtime(1) . ')}' . $url);
// 输出
debugGet();