相关文章:
https://cloud.tencent.com/developer/article/1953211

JSON相关函数

MySQL官方列出json相关的函数,完整列表如下:

创建

json_array|创建json数组

json_object|创建json对象

json_quote|将json转成json字符串类型

查询json

json_contains|判断是否包含某个json值

json_contains_path|判断某个路径下是否包json值

json_extract|提取json值

column->path|json_extract的简洁写法,MySQL 5.7.9开始支持

column->>path|json_unquote(column -> path)的简洁写法

json_keys|提取json中的键值为json数组

json_search|按给定字符串关键字搜索json,返回匹配的路径

修改json

json_append|废弃,MySQL 5.7.9开始改名为json_array_append

json_array_append|末尾添加数组元素,如果原有值是数值或json对象,则转成数组后,再添加元素

json_array_insert|插入数组元素

json_insert|插入值(插入新值,但不替换已经存在的旧值)

json_merge|合并json数组或对象

json_remove|删除json数据

json_replace|替换值(只替换已经存在的旧值)

json_set|设置值(替换旧值,并插入不存在的新值)

json_unquote|去除json字符串的引号,将值转成string类型

返回json属性

json_depth|返回json文档的最大深度

json_length|返回json文档的长度

json_type|返回json值得类型

json_valid|判断是否为合法json文档

以下是一个用PHP实现的概率函数,它接收一个概率值作为参数,并根据该概率随机返回true(中)或false(不中):

<?php
/**
 * 根据给定的概率值返回布尔结果
 * @param float $probability 概率值,范围0-100(包含)
 * @return bool true表示中,false表示不中
 */
function probabilityResult(float $probability): bool {
    // 确保概率在有效范围内
    $probability = max(0, min(100, $probability));
    
    // 生成1到100之间的随机整数
    $randomNumber = mt_rand(1, 100);
    
    // 判断是否在概率范围内
    return $randomNumber <= $probability;
}

// 示例使用
$chance = 30; // 30%的概率
$result = probabilityResult($chance);
echo $result ? "中了!" : "未中";
?>

这个函数的工作原理是:

  1. 首先将传入的概率值限制在0-100的范围内
  2. 使用mt_rand()函数生成一个1到100之间的随机整数(mt_rand()rand()更适合用于概率计算)
  3. 如果生成的随机数小于或等于传入的概率值,则返回true(中),否则返回false(不中)

例如,如果你传入30作为概率值,那么函数有30%的概率返回true,70%的概率返回false

下面提供几种不同实现思路的概率函数,各有特点和适用场景:

1. 浮点数精度算法(支持0-1概率)

function floatProbability(float $probability): bool {
    if ($probability <= 0) return false;
    if ($probability >= 1) return true;
    
    // 归一化到0-1区间
    $normalized = max(0, min(1, $probability));
    return (random_int(0, PHP_INT_MAX) / PHP_INT_MAX) < $normalized;
}

特点

  • 直接支持0.001%这样的极小概率
  • 使用random_int()生成高安全性随机数
  • 通过浮点数比较实现高精度概率

2. 权重随机算法(适合多选项概率分布)

/**
 * 权重随机选择
 * @param array $weights ['选项A' => 30, '选项B' => 70]
 * @return string|false 选中的选项键名
 */
function weightedRandom(array $weights) {
    $total = array_sum($weights);
    $rand = random_int(1, $total);
    
    foreach ($weights as $key => $weight) {
        $rand -= $weight;
        if ($rand <= 0) {
            return $key;
        }
    }
    
    return false;
}

// 示例:30%概率返回true,70%返回false
$result = weightedRandom([true => 30, false => 70]) === true;

特点

  • 适合实现复杂概率分布(如抽奖池)
  • 所有选项权重之和代表100%概率
  • 通过区间划分实现权重选择

3. 模拟概率波动算法(游戏常用)

class ProbabilityShaker {
    private float $baseProbability;
    private float $currentChance = 0;
    private float $growthRate = 0.1;
    
    public function __construct(float $baseProbability, float $growthRate = 0.1) {
        $this->baseProbability = $baseProbability;
        $this->growthRate = $growthRate;
    }
    
    public function try(): bool {
        $chance = $this->baseProbability + $this->currentChance;
        $result = (random_int(1, 100) <= $chance);
        
        if ($result) {
            $this->currentChance = 0; // 触发后重置
        } else {
            $this->currentChance += $this->growthRate; // 未触发则增加下次概率
        }
        
        return $result;
    }
}

// 示例:基础30%概率,每次失败后增加10%补偿
$shaker = new ProbabilityShaker(30, 10);
$result = $shaker->try();

特点

  • 实现"保底机制",多次失败后概率递增
  • 适合游戏抽卡、暴击率等场景
  • 通过状态累积改变实际概率

4. 时间相关概率算法

function timeBasedProbability(float $probability): bool {
    // 获取当前时间的毫秒级哈希值
    $timeHash = crc32(microtime(true));
    $normalizedHash = ($timeHash % 10000) / 100; // 转换为0-100的浮点数
    
    return $normalizedHash <= $probability;
}

特点

  • 相同时间点调用结果相同(伪随机)
  • 适合需要时间稳定性的概率系统
  • 可用于限时活动概率调整

应用场景建议:

  • 普通概率判断:使用原始答案的整数区间法
  • 高精度概率:使用浮点数精度算法
  • 多选项随机:使用权重随机算法
  • 游戏机制:使用概率波动算法
  • 时间相关系统:使用时间哈希算法

阮老师的文章:https://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

用法

 var d1 = $.Deferred();
    $.getJSON('./data/chart-1.json').then(function(data){
        initChart1(data).on('rendered', function () {
            d1.resolve();
        });
    });

    var d2 = $.Deferred();
    $.getJSON('./data/chart-2.json').then(function(data) {
        initChart2(data).on('rendered', function () {
            d2.resolve();
        });
    });

    $.when(d1,d2).then(function(){
        /** 2个图表渲染完毕后,执行PDF Book渲染 **/
        bookConfig.start = true;
    });

如果高于1.5.0版本,返回的是deferred对象

$.ajax("test.html")

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

指定同一操作的多个回调函数

 $.ajax("test.html")

  .done(function(){ alert("哈哈,成功了!");} )

  .fail(function(){ alert("出错啦!"); } )

  .done(function(){ alert("第二个回调函数!");} );

为多个操作指定回调函数

$.when($.ajax("test1.html"), $.ajax("test2.html"))

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

普通操作的回调函数接口 $.Deferred()

var dtd = $.Deferred(); // 新建一个deferred对象

  var wait = function(dtd){

    var tasks = function(){

      alert("执行完毕!");

      dtd.resolve(); // 改变deferred对象的执行状态

    };

    setTimeout(tasks,5000);

    return dtd;

  };

  $.when(wait(dtd))

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

deferred.resolve()方法和deferred.reject()方法

  var dtd = $.Deferred(); // 新建一个Deferred对象

  var wait = function(dtd){

    var tasks = function(){

      alert("执行完毕!");

      dtd.reject(); // 改变Deferred对象的执行状态

    };

    setTimeout(tasks,5000);

    return dtd;

  };

  $.when(wait(dtd))

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

小结:deferred对象的方法

 (1) $.Deferred() 生成一个deferred对象。

  (2) deferred.done() 指定操作成功时的回调函数

  (3) deferred.fail() 指定操作失败时的回调函数

  (4) deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。

  (5) deferred.resolve() 手动改变deferred对象的运行状态为"已完成",从而立即触发done()方法。

  (6)deferred.reject() 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为"已失败",从而立即触发fail()方法。

  (7) $.when() 为多个操作指定回调函数。

除了这些方法以外,deferred对象还有二个重要方法,上面的教程中没有涉及到。

  (8)deferred.then()

按宽高比3:4剪裁,居中,保留宽100%,高自适应进行剪裁

#! /bin/bash

ffmpeg -i "$1" -vf crop=iw:iw*4/3 "$2"

按宽高比3:4剪裁,居中,保留高100%,宽自适应进行剪裁

#! /bin/bash

ffmpeg -i "$1" -vf crop=ih*3/4:ih "$2"

说明:
ih:表示原视频高度
iw:表示原视频宽度

iw:iw*4/3 后面还可以跟x,y坐标表示从左上角坐标开始,比如人0,0坐标处开始:

ffmpeg -i "$1" -vf crop=iw:iw*4/3:0:0 "$2"