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

问题描述

实际上,我想将表中的某些值与数组进行比较,并输出与数组具有相等值的键。 问题是:如果我是对的,数据库中的值是按位的。不知道用英文解释是否正确。

示例:这里的一些示例值形成表 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
);

这里是遍历数组的示例,实际上是来自数据库的假结果以简化代码

$fakerow = 256;
foreach ($userrights_array as $key => $value) {
  if ($value == $fakerow) {
    print_r($key);
  }
};

我现在需要的是一种解决方案,不仅可以打印出数据库的值,还可以执行将数组中的值与数据库中的值进行比较并检查哪个适合例如 65 的操作。

我猜我必须在 if 部分进行比较,但不知道如何做。

输出应该像“UR_SWP”+“UR_LEAD”

我的表单中的实际结果如下所示:

preview of the table

解决方法

如果您想以文字形式打印出权限,您可以先使用 let rectObj = canvas1.getObjects()[0]; const tl = rectObj.aCoords.tl; const tr = rectObj.aCoords.tr; const bl = rectObj.aCoords.bl; let rectCopy = new fabric.Rect({ left: rectObj.aCoords.tl.x,top: rectObj.aCoords.tl.y,width: (new fabric.Point(tl.x,tl.y).distanceFrom(tr)),height: (new fabric.Point(tl.x,tl.y).distanceFrom(bl)),angle: fabric.util.radiansToDegrees(Math.atan2(tr.y - tl.y,tr.x - tl.x)),fill: "red",}) 以文字形式创建具有权限的值映射。这里的重点是收集当前权限中bit为1的权限。

现在,只需将手头的当前权限值转换为二进制并收集特定 2 的幂的适当权限并打印出结果。

array_flip()
,

“按位与”(&) 运算符是一个选项:

<?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,18497: UR_SWP,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 
)