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);