[英]PHP Bitwise compare values from database with an array
实际上,我想将表中的一些值与数组进行比较,并且 output 的键具有相同的数组值。 问题是:如果我是对的,数据库中的值是按位的。 不知道这是否是正确的英文解释。
示例:这里有一些示例值来自表 1,65,2081,2145,18497,32769 65 包含 64 即“UR_LEAD”和 1 即“UR_SWP”
这里是我想比较的数组:
$userrights_array = array(
"UR_SWP" => 1,
"UR_BUHA" => 2,
"UR_AZ" => 4,
"UR_SA" => 8,
"UR_FIDI" => 16,
"UR_ADMIN" => 32,
"UR_LEAD" => 64,
"UR_AZ_EVENT" => 128,
"UR_SA_COMPLIANCE" => 256,
"UR_CH" => 512,
"UR_USERMOD" => 1024,
"UR_SWP_GL" => 2048,
"UR_MEDB" => 4096,
"UR_SWP_GP" => 8192,
"UR_STAFF_DEPT" => 16384,
"UR_MEET_KEYUSER" => 32768,
"UR_MEET_ADMIN" => 65536
);
这里是循环遍历数组的示例,实际上是来自数据库的 fakeresult 以简化代码。
$fakerow = 256;
foreach ($userrights_array as $key => $value) {
if ($value == $fakerow) {
print_r($key);
}
};
我现在需要的是一种解决方案,不仅可以打印出数据库的值,还可以执行一个操作,将数组中的值与数据库中的值进行比较,并检查哪个适合例如 65。
猜猜我必须在 if 部分进行比较,但不知道该怎么做。
Output 应该像“UR_SWP”+“UR_LEAD”
我的表单中的实际结果如下所示:
如果您想以文字形式打印权限,您可以首先使用array_flip()
创建一个 map 值,并以文本形式显示权限。 这里的重点是收集当前权限中位设置为1的权限。
现在,只需将手头的当前权限值转换为二进制,并为特定的 2 次幂收集适当的权限并打印出结果。
<?php
$userrights_array = array(
"UR_SWP" => 1,
"UR_BUHA" => 2,
"UR_AZ" => 4,
"UR_SA" => 8,
"UR_FIDI" => 16,
"UR_ADMIN" => 32,
"UR_LEAD" => 64,
"UR_AZ_EVENT" => 128,
"UR_SA_COMPLIANCE" => 256,
"UR_CH" => 512,
"UR_USERMOD" => 1024,
"UR_SWP_GL" => 2048,
"UR_MEDB" => 4096,
"UR_SWP_GP" => 8192,
"UR_STAFF_DEPT" => 16384,
"UR_MEET_KEYUSER" => 32768,
"UR_MEET_ADMIN" => 65536
);
$userrights_array_flipped = array_flip($userrights_array);
foreach([1,65,2081,2145,18497,32769] as $val){
$pow_2 = 1;
$rights = [];
while($val > 0){
$d = $val % 2;
if($d == 1 && isset($userrights_array_flipped[$pow_2])){
$rights[] = $userrights_array_flipped[$pow_2];
}
$pow_2 <<= 1;
$val >>= 1;
}
echo implode(",",$rights),PHP_EOL;
}
“按位与” ( &
) 运算符是一个选项:
<?php
$userrights = array(
"UR_SWP" => 1,
"UR_BUHA" => 2,
"UR_AZ" => 4,
"UR_SA" => 8,
"UR_FIDI" => 16,
"UR_ADMIN" => 32,
"UR_LEAD" => 64,
"UR_AZ_EVENT" => 128,
"UR_SA_COMPLIANCE" => 256,
"UR_CH" => 512,
"UR_USERMOD" => 1024,
"UR_SWP_GL" => 2048,
"UR_MEDB" => 4096,
"UR_SWP_GP" => 8192,
"UR_STAFF_DEPT" => 16384,
"UR_MEET_KEYUSER" => 32768,
"UR_MEET_ADMIN" => 65536
);
$rows = array(1, 65, 2081, 2145, 18497, 32769);
foreach ($rows as $row) {
echo $row.": ";
foreach ($userrights as $key => $userright) {
if ($userright & $row) {
echo $key.", ";
}
};
echo "<br>";
}
?>
如果要将结果存储在字符串变量或数组中,这可能会有所帮助:
<?php
...
// Store the output as a text
$output = "";
foreach ($rows as $row) {
$output .= ($output === "" ? "" : ", ");
foreach ($userrights as $key => $userright) {
if ($userright & $row) {
$output .= ($output === "" ? "" : " ") . $key;
}
};
}
echo $output;
echo "<br>";
// Store the output as an array
$output = array();
foreach ($rows as $row) {
$s = "";
foreach ($userrights as $key => $userright) {
if ($userright & $row) {
$s .= ($s === "" ? "" : " ") . $key;
}
};
$output[] = $s;
}
echo print_r($output, true);
echo "<br>";
?>
结果:
1: UR_SWP,
65: UR_SWP, UR_LEAD,
2081: UR_SWP, UR_ADMIN, UR_SWP_GL,
2145: UR_SWP, UR_ADMIN, UR_LEAD, UR_SWP_GL,
18497: UR_SWP, UR_LEAD, UR_SWP_GL, UR_STAFF_DEPT,
32769: UR_SWP, UR_MEET_KEYUSER,
UR_SWP, UR_SWP UR_LEAD, UR_SWP UR_ADMIN UR_SWP_GL, UR_SWP UR_ADMIN UR_LEAD UR_SWP_GL, UR_SWP UR_LEAD UR_SWP_GL UR_STAFF_DEPT, UR_SWP UR_MEET_KEYUSER
Array (
[0] => UR_SWP
[1] => UR_SWP UR_LEAD
[2] => UR_SWP UR_ADMIN UR_SWP_GL
[3] => UR_SWP UR_ADMIN UR_LEAD UR_SWP_GL
[4] => UR_SWP UR_LEAD UR_SWP_GL UR_STAFF_DEPT
[5] => UR_SWP UR_MEET_KEYUSER
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.