packaged_task代码解析

调用:auto task = std::packaged_task<int(int a, int b)>(Test);阅读全文→


范文泉 发布于 2026-07-16 11:09

线程池的实现和解读

[该文章已加密,请点击标题输入密码访问]


范文泉 发布于 2026-07-15 19:38

正则表达式正向先行断言拆解

^(?=.*[A-Z]) 是一个正向先行断言(Positive Lookahead)阅读全文→


范文泉 发布于 2026-06-05 11:05

RedisClient使用例子

RedisClient使用例子阅读全文→


范文泉 发布于 2026-05-13 10:47

libIXWebSocket的使用DEMO

include "libIXWebSocket/libIXWebSocket.h"阅读全文→


范文泉 发布于 2026-05-11 17:51

yaml-cpp主要功能测试程序

yaml-cpp主要功能测试程序阅读全文→


范文泉 发布于 2026-05-09 16:07

将一个表数据插入到另一个表的SQL语句

[该文章已加密,请点击标题输入密码访问]


范文泉 发布于 2026-05-08 22:35

VSCode终端(Windows Terminal)文本出现纯色背景问题解决方法

不知道是最近的哪一次自动更新,当 Windows Terminal 背景透明度不为100%时,PowerShell 的文字会出现黑色的纯色背景,排查了终端美化工具和配色设置均没发现问题,最后发现该Bug跟PowerShell中的 PSReadline 模块相关。阅读全文→


范文泉 发布于 2026-04-27 09:14

PHP里for循环引用变量未unset所带来的问题


$items = [['a' => '1', 'b' => 1], ['a' => '2', 'b' => 2], ['a' => '3', 'b' => 3]];
foreach ($items as &$item) {
}

$items[] = ['a' => '4', 'b' => 4];
for ($i = 0; $i < count($items); $i++) {
    $item = $items[$i];
}
```<span class="readmore"><a href="http://blog.3w3k.com/post-150.html">阅读全文&rarr;</a></span>

范文泉 发布于 2026-04-24 17:28

Windows批处理学习笔记

[该文章已加密,请点击标题输入密码访问]


范文泉 发布于 2026-03-22 21:43

Gitea备份脚本代码,包括本地备份和异地备份

[该文章已加密,请点击标题输入密码访问]


范文泉 发布于 2026-03-19 20:37

Git 工作流参考手册

[该文章已加密,请点击标题输入密码访问]


范文泉 发布于 2026-03-13 00:40

使用PDO_ODBC测试PHP服务器到SQL Server数据库的连接时间

// 构建 DSN(数据源名称)
// 格式:"odbc:Driver={SQL Server};Server=服务器地址;端口;Database=数据库名"
// 如果服务器是命名实例,Server 部分可写为:'服务器地址\实例名,端口'
$dsn = "odbc:Driver={SQL Server};Server={$db_host};{$db_port};Database={$db_name},Network=DBMSSOCN";阅读全文→


范文泉 发布于 2026-03-10 15:54

ElementUI在任意输入框按回车就触发提交

@submit.prevent="OnSearchClick"
native-type="submit"
阅读全文→


范文泉 发布于 2026-03-07 09:04

sql server使用的大致步骤

1、创建数据库
2、创建 Schema
3、创建登录账号(Login)
4、创建数据库用户(User)
5、按 Schema 授权(核心步骤)阅读全文→


范文泉 发布于 2026-03-05 09:06

PHP中 `unset()` 不会导致数组重排 —— 原理与解决方案

一、前言

在日常 PHP 编程中,我们经常使用 unset() 删除数组中的元素,例如:

$arr = [ 'a', 'b', 'c' ];
unset($arr[1]);
print_r($arr);

很多人以为执行后数组会变成:

['a', 'c']

但实际上输出结果是:

Array
(
    [0] => a
    [2] => c
)

可以看到索引 没有重新排列,原来的下标 [1] 被删除后,PHP 并不会自动调整后续元素的索引。

二、原因分析:PHP 数组的本质

PHP 的数组是 有序哈希表(Ordered Hash Table),
既可以用作索引数组,也可以用作关联数组。

当你执行:

unset($arr[1]);

PHP 实际上只是从哈希表中 移除了该键对应的项,
但不会重新分配其它键(即不会重排)。

这样设计的好处是:

删除元素开销小;

维持键的稳定性;

保证关联数组不被破坏。

三、实际影响

这种行为在某些场景下会导致逻辑错误:

❌ 示例 1:使用 for 循环遍历
$arr = [ 'a', 'b', 'c' ];

for ($i = 0; $i < count($arr); $i++) {
    if ($arr[$i] === 'b') unset($arr[$i]);
}
print_r($arr);

输出结果:

Array
(
    [0] => a
    [2] => c
)

由于索引跳跃,$arr[1] 被删除后,count() 返回 3,但 $arr[1] 不存在。
如果后续逻辑依赖索引顺序(比如 $arr[$i+1]),就会出错。

四、解决方案

✅ 方案 1:使用 array_values() 重排索引
$arr = [ 'a', 'b', 'c' ];
unset($arr[1]);
$arr = array_values($arr);

print_r($arr);

输出:

Array
(
    [0] => a
    [1] => c
)

array_values() 会重新生成从 0 开始的连续索引,非常适合处理纯数字索引数组。

✅ 方案 2:使用 foreach 遍历 + unset
$arr = [ 'a', 'b', 'c' ];

foreach ($arr as $key => $value) {
    if ($value === 'b') unset($arr[$key]);
}
print_r($arr);

PHP 的 foreach 遍历使用内部指针,即使当前元素被删除,也不会影响循环行为。
但仍然不会重排索引。

如果后续需要连续索引,可再执行:

$arr = array_values($arr);

✅ 方案 3:反向遍历删除(for 循环)
$arr = [ 'a', 'b', 'c' ];

for ($i = count($arr) - 1; $i >= 0; $i--) {
    if ($arr[$i] === 'b') unset($arr[$i]);
}
print_r($arr);

这种写法在删除多个元素时能保证不会“跳过”元素。

✅ 方案 4:用关联键(推荐用于复杂数据结构)

如果你的数据是关联数组(如数据库记录),
可以直接用键值操作,避免索引问题:

    $db = [
        ['id' => 1, 'name' => 'A'],
        ['id' => 2, 'name' => 'B'],
        ['id' => 3, 'name' => 'C']
    ];

// 重新索引成 id=>item
$map = [];
foreach ($db as $item) {
    $map[$item['id']] = $item;
}

// 删除指定 id
unset($map[2]);

print_r(array_values($map));

输出:

Array
(
    [0] => Array ( [id] => 1 [name] => A )
    [1] => Array ( [id] => 3 [name] => C )
)

五、总结对比

场景 是否重排 适用情况 推荐度
unset() 直接删除 ❌ 否 临时删除,不依赖索引 ⭐
array_values() 重排 ✅ 是 删除后需保持连续索引 ⭐⭐⭐⭐
foreach + unset() ❌ 否 逻辑删除但不重排 ⭐⭐⭐
反向 for 删除 ❌ 否 控制删除顺序 ⭐⭐
关联键删除 ✅ 无影响 有唯一 ID 键的数组


范文泉 发布于 2025-10-23 16:41

win32程序实现最小化到托盘

POINT pt; GetCursorPos(&pt);
SetForegroundWindow(m_hWnd); //右击后点别地可以清除“右击出来的菜单”

    HMENU hMenu; //托盘菜单    win32程序使用的是HMENU,如果是MFC程序可以使用CMenu
    hMenu = CreatePopupMenu();//生成托盘菜单   
    AppendMenu(hMenu, MF_STRING, WM_ONCLOSE, _T("退出"));  

    int cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, m_hWnd,  NULL);  
    if(cmd == WM_ONCLOSE)   
    {
        //退出程序
        m_nid.hIcon = NULL;
        Shell_NotifyIcon(NIM_DELETE, &m_nid);
        ::PostQuitMessage(0);
    }

范文泉 发布于 2025-09-28 14:05

生产中的序列号因php弱类型带来的问题

$a['modulesn'] = "0542509004725";  
$b = "00542509004725";

一个是 以 0 开头,另一个是 以 00 开头。
按理说用 != 应该返回 true(不相等),但你说结果是 false(相等)。

原因:PHP 的弱类型比较(类型转换问题)

在 PHP 里,!=、== 会触发 弱类型比较:
如果两个字符串看起来都是 数字字符串,PHP 会把它们转换成数字再比较。
"0542509004725" 和 "00542509004725" 都会被转换成 542509004725(整数)。
转换后它们相等,所以 != 返回 false。

验证

var_dump((int)"0542509004725");   // int(542509004725)
var_dump((int)"00542509004725");  // int(542509004725)

结果一样。

解决办法

如果你想比较字符串本身,而不是数值:

用 全等比较 !== 或 ===

var_dump($a['modulesn'] !== $b); // true

或者强制用 字符串比较函数

var_dump(strcmp($a['modulesn'], $b) !== 0); // true

建议:凡是涉及可能带前导 0 的数据(比如条码、序列号、工号),一定要用 === 来比较,不要用 == 或 !=。


范文泉 发布于 2025-09-11 15:20