Skip to content

Instantly share code, notes, and snippets.

@benwills
Last active December 5, 2021 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benwills/f32754b0939c8ea67d974f91d4071444 to your computer and use it in GitHub Desktop.
Save benwills/f32754b0939c8ea67d974f91d4071444 to your computer and use it in GitHub Desktop.
Using Enums for Bitfield Values in PHP8.1 (and convert int values to string arrays or original enum value arrays)
<?php
enum Status : int
{
case Undefined = 0;
case Opt1 = 1 << 0;
case Opt2 = 1 << 62;
case Opt3 = 1 << 63;
static public function MatchArr(int $x) : false|array
{
if ($x === 0) { return [Status::Undefined]; }
$ret = [];
for ($i = 0; $i <= 63; $i++) {
if ($x & (1 << $i)) {
$ret[] = Status::from($x & (1 << $i));
}
}
if (empty($ret)) { return false; }
return $ret;
}
static public function ToStrings(int $x) : false|array
{
if ($x === 0) { return ['Undefined']; }
$ret = [];
if ($x & self::Opt1->value) { $ret[] = 'Opt1'; }
if ($x & self::Opt2->value) { $ret[] = 'Opt2'; }
if ($x & self::Opt3->value) { $ret[] = 'Opt3'; }
if (empty($ret)) { return false; }
return $ret;
}
}
//////////////////////////////////////////////////////
// for ($i = 0; $i <= 64; $i++) {
// echo "Bit# ".($i+1)." : ".(1 << $i)."\n";
// }
//////////////////////////////////////////////////////
echo "\n";
$x1 = 1;
$x4 = 4;
$x = $x1 | $x4;
if ($x & 4) {
echo "true\n";
} else {
echo "false\n";
}
if ($x & 2) {
echo "true\n";
} else {
echo "false\n";
}
//////////////////////////////////////////////////////
echo "\n";
echo "$x\n";
$x = Status::Opt2->value;
if ($x & (1 << 62)) {
echo "true\n";
} else {
echo "false\n";
}
$x = Status::Opt3->value;
if ($x & (1 << 63)) {
echo "true\n";
} else {
echo "false\n";
}
//////////////////////////////////////////////////////
echo "\n";
$x = Status::Opt2->value;
echo "$x: ".str_pad(decbin($x),64,'0',STR_PAD_LEFT)."\n";
$x = Status::Opt3->value;
echo "$x: ".str_pad(decbin($x),64,'0',STR_PAD_LEFT)."\n";
$x = Status::Opt3->value | Status::Opt2->value;
echo "$x: ".str_pad(decbin($x),64,'0',STR_PAD_LEFT)."\n";
if ($x & Status::Opt3->value) {
echo "true\n";
} else {
echo "false\n";
}
if ($x & Status::Opt1->value) {
echo "true\n";
} else {
echo "false\n";
}
//////////////////////////////////////////////////////
echo "\n";
$x = Status::Opt3->value | Status::Opt2->value;
$matchArr = Status::MatchArr($x);
if ($matchArr) {
foreach ($matchArr as $matchItem) {
echo $matchItem->value."\n";
}
} else {
echo "false\n";
}
$matchArr = Status::ToStrings($x);
if ($matchArr) {
foreach ($matchArr as $matchItem) {
echo $matchItem."\n";
}
} else {
echo "false\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment