在 Web 开发中,我们常常需要为用户设置一组权限。为了简化权限的存储和传输,可以将权限状态压缩成一个整数。PHP 的 bindec 函数可以帮我们把一个二进制字符串转换成十进制整数,而这恰好适合用来处理权限码的编码和解码。
假设我们有一组布尔值代表用户的权限状态,例如:
$permissions = [true, false, true, true];
每一位布尔值代表一种权限,true 表示拥有该权限,false 表示没有该权限。我们希望将这个数组转换成一个十进制整数,便于存储和比较。
bindec 是 PHP 中的一个内建函数,它将一个二进制字符串转换成十进制数字。用法如下:
$decimal = bindec('1011'); // 结果是11
那么,如何将布尔数组转换成 '1011' 这样的格式呢?
<?php
function convertPermissionsToDecimal(array $boolArray): int {
// 将布尔值转换为二进制字符串
$binaryString = '';
foreach ($boolArray as $bool) {
$binaryString .= $bool ? '1' : '0';
}
// 使用 bindec 转换为十进制
return bindec($binaryString);
}
// 示例
$permissions = [true, false, true, true]; // 表示拥有第1、第3、第4个权限
$decimalCode = convertPermissionsToDecimal($permissions);
echo "权限十进制码是:$decimalCode"; // 输出:权限十进制码是:11
这段代码中,我们遍历布尔数组,构造出一个对应的二进制字符串,然后调用 bindec 将其转换为十进制。
当我们从数据库读取到一个十进制权限码时,也可以反向将其还原成布尔数组,方法如下:
<?php
function convertDecimalToPermissions(int $decimal, int $length): array {
// 转换为二进制字符串并补足指定位数
$binaryString = str_pad(decbin($decimal), $length, '0', STR_PAD_LEFT);
// 转换为布尔数组
return array_map(fn($bit) => $bit === '1', str_split($binaryString));
}
// 示例:还原11为布尔数组
$restored = convertDecimalToPermissions(11, 4);
print_r($restored); // 输出:[true, false, true, true]
这种方法在设置用户权限、角色控制、配置项等系统中非常实用。例如,在 https://m66.net/admin/users 这样的用户管理后台中,我们可以将每个用户的权限压缩成一个字段存储在数据库中,提高效率和安全性。
通过 bindec 函数,我们可以轻松地将布尔权限数组转换为紧凑的十进制码,从而简化存储和计算。配合 decbin 和适当的字符串处理,权限的管理将更加高效和系统化。