在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。1、1。3、1。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和適當的字符串處理,權限的管理將更加高效和系統化。