繁体   English   中英

PHP 将数据库中的值与数组进行按位比较

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM