PHP算法累计

1)每三个组成一个数组, 成为三个连续或相同数字

<?php
//$arr = [1, 2, 3, 3, 4, 5, 3, 4, 3];
$arr = [5, 2, 3, 3, 4, 5, 5, 1, 5];
//$arr = [1, 2, 3, 1, 2, 3, 1, 2, 3];
// $arr = [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3];
sort($arr); // 从小到大排序(重要)
$xiangtong = [];
$lianxu    = [];
$n         = count($arr);
for ($i = 0; $i < $n; $i++) {
	for ($j = $i + 1; $j < $n; $j++) {
  		for ($k = $j + 1; $k < $n; $k++) {
		   if (!isset($arr[$i]) || !isset($arr[$j]) || !isset($arr[$k])) {
		   		continue;
	   		}
	   		$str = $arr[$i] . $arr[$j] . $arr[$k];
	   		if ($arr[$i] == $arr[$j] - 1 && $arr[$i] == $arr[$k] - 2) {
	    		$lianxu[] = $str;
			    unset($arr[$i]);
			    unset($arr[$j]);
			    unset($arr[$k]);
	   		} elseif ($arr[$i] == $arr[$j] && $arr[$i] == $arr[$k]) {
			    $xiangtong[] = $str;
			    unset($arr[$i]);
			    unset($arr[$j]);
			    unset($arr[$k]);
	   		}
  		}
	}
}
echo '<pre>';
echo '连续排序';
echo '<br>';
print_r($lianxu);
echo '<br>';
echo '相同排序';
echo '<br>';
print_r($xiangtong);
echo '<br>';
echo '剩余';
echo '<br>';
// 还剩余
print_r($arr);
echo '<br>';
if (count($arr) == 0) {
 die('分组完成:' . implode(', ', array_merge($lianxu, $xiangtong)));
} else {
 die('不能分组');
}

测试结果

连续排序
Array
(
    [0] => 123
    [1] => 345
)

相同排序
Array
(
    [0] => 555
)

剩余
Array
(
)

分组完成:123, 345, 555

这里只测试了第二种数组情况, 其他可自行测试


2)二分查找

/**
 * 二分查找
 * @param $arr  查找数组
 * @param $min  最小值
 * @param $max  最大值
 * @param $k    查找的值
 * @return int  需要查找值得位置
 */
function binary_search($arr, $min, $max, $k)
{
    if ($min <= $max) {
        $mid = intval(($min + $max) / 2);
        if ($arr[$mid] == $k) {
            return $mid;
        } else if ($k < $arr[$mid]) {
            return binary_search($arr, $min, $mid - 1, $k);
        } else {
            return binary_search($arr, $mid + 1, $max, $k);
        }
    }
    return -1;
}

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var_dump(binary_search($arr, 1, 10, 10));

3)冒泡排序

$arr = [5, 2, 3, 1, 6, 7, 10, 9];
$num = count($arr);

for ($i = 0; $i < $num; $i++){
	for ($j = $i+1; $j < $num; $j++){
		if ($arr[$i] > $arr[$j]) {
			$temp = $arr[$i];
			$arr[$i] = $arr[$j];
			$arr[$j] = $temp;
		}
	}
}

echo '<pre>';
print_r($arr);

结果

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 5
    [4] => 6
    [5] => 7
    [6] => 9
    [7] => 10
)

4)PHP 概率事件

	public function index()
    {
        $data = ['a' => 10, 'b' => 20, 'c' => 30, 'd' => 40];
        if (!is_array($data) || count($data) == 0)
            return false;
        //进行升序排序
        asort($data);
        $random = rand(1, 100);
        $sum = 0;
        $probability = '';
        foreach ($data as $k => $v) {
            $sum += $v;
            if ($random <= $sum) {
                $probability = $k;
                break;
            }
        }
        return $probability;
    }

5)每次的数值在平均值上下波动

// 48为奖励总值, 24为一天发放小时数
$h = 48 / 24;
$num = 0;
$arr = [];
for ($i=1; $i <= 23; $i++) { 
	$count++;
	// 获取发放奖励波动值, 100 为小数点后三位
	$r = round(lcg_value(), 1) / 100;
	if ($count%2 == 0) { // 偶数
		$arr[$count] = ($h - $r);
		$num += ($h - $r);
	} else if ($count%2 == 1) { // 奇数
		$arr[$count] = ($h + $r);
		$num += ($h + $r);
	}
}

$sum = array_sum($arr);
$sum = 48 - $sum;
// 将最后一个数字压入数组
array_push($arr, $sum);

6)微信红包算法

	/**
     * 奖励发放
     * @param $number   红包个数
     * @param $reward   总金额
     * @return array    发放红包数组
     */
    public function Awarding($number, $reward)
    {
        $award_arr = [];
        for ($i = 0; $i < $number; $i++) {
            if ($i == $number - 1) {
                $award_arr[] = $reward;
            } else {
            	// 剩余数量红包的最大值
                $min = $reward / ($number - $i) * 0.9;
                $max = $reward / ($number - $i) * 1.1;
                // 红包范围大小可修改上面的 0.9 ~ 1.1
                $num_info = rand($min, $max);
                $award_arr[] = $num_info;
                $reward -= $num_info;
            }
        }
        return $award_arr;
    }

7)优雅的重组两个数组的数据

例:

$users = [
    ["id" => 1, "name" => "a"],
    ["id" => 2, "name" => "b"]
];
$list = [
    ["user_id" => 1, "option" => 10],
    ["user_id" => 1, "option" => 11],
    ["user_id" => 1, "option" => 12],
    ["user_id" => 2, "option" => 10],
    ["user_id" => 2, "option" => 11],
    ["user_id" => 2, "option" => 12]
];

预期:

$data = [
    [
        "id" => 1,
        "name" => "a",
        "list" => [
            ["user_id" => 1, "option" => 10],
            ["user_id" => 1, "option" => 11],
            ["user_id" => 1, "option" => 12]
        ]
    ],
        [
        "id" => 2,
        "name" => "b",
        "list" => [
            ["user_id" => 2, "option" => 10],
            ["user_id" => 2, "option" => 11],
            ["user_id" => 2, "option" => 12],
        ]
    ]
];

解决:

	$users = [
        ["id" => 1, "name" => "a"],
        ["id" => 2, "name" => "b"]
    ];
    $list = [
        ["user_id" => 1, "option" => 10],
        ["user_id" => 1, "option" => 11],
        ["user_id" => 1, "option" => 12],
        ["user_id" => 2, "option" => 10],
        ["user_id" => 2, "option" => 11],
        ["user_id" => 2, "option" => 12]
    ];
    
    // 参数二为空时,返回整个数组
    $users = array_column($users,null,"id");
    // 对数组中的每个元素应用用户自定义函数
    array_walk($list,function ($item) use (&$users) {
        if (array_key_exists($item["user_id"],$users))
            $users[$item["user_id"]]["list"][] = $item;
    });
    $users = array_values($users);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

siner.li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值