You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中利用十六进制码解析食品过敏原编码?

解决方案:匹配过敏原编码对应的标签

核心逻辑是利用按位与操作,因为给定的过敏原数组中每个value都是唯一的2的幂次(对应二进制中单个为1的位),数据库存储的十进制数值本质是这些value的累加(或按位或)结果,通过按位与可以精准匹配出包含的过敏原。

实现代码

// 给定的过敏原数组
$allergens = array(
  "celery"      => array("label" => "Celery",      "short" => "", "value" => 0x00000001),
  "crustaceans" => array("label" => "Crustaceans", "short" => "", "value" => 0x00000002),
  "eggs"        => array("label" => "Eggs",        "short" => "", "value" => 0x00000010),
  "fish"        => array("label" => "Fish",        "short" => "", "value" => 0x00000020),
  "gluten"      => array("label" => "Gluten",      "short" => "", "value" => 0x00000040),
  "lupin"       => array("label" => "Lupin",       "short" => "", "value" => 0x00000080),
  "milk"        => array("label" => "Milk",        "short" => "", "value" => 0x00000100),
  "molluscs"    => array("label" => "Molluscs",    "short" => "", "value" => 0x00000200),
  "mustard"     => array("label" => "Mustard",     "short" => "", "value" => 0x00000400),
  "nuts"        => array("label" => "Nuts",        "short" => "", "value" => 0x00001000),
  "peanuts"     => array("label" => "Peanuts",     "short" => "", "value" => 0x00002000),
  "sesame"      => array("label" => "Sesame",      "short" => "", "value" => 0x00004000),
  "soya"        => array("label" => "Soya",        "short" => "", "value" => 0x00008000),
  "sulphur"     => array("label" => "Sulphur",     "short" => "", "value" => 0x00010000),
);

// 匹配函数:输入数据库的十进制数值,返回对应的过敏原标签数组
function getAllergenLabels(int $dbValue, array $allergens): array {
    $matchedLabels = [];
    
    foreach ($allergens as $allergen) {
        // 按位与判断当前过敏原是否被包含在编码中
        if (($dbValue & $allergen['value']) !== 0) {
            $matchedLabels[] = $allergen['label'];
        }
    }
    
    return $matchedLabels;
}

测试示例

// 示例1:数据库值16448(十六进制4040)
$labels1 = getAllergenLabels(16448, $allergens);
print_r($labels1);
// 输出:Array ( [0] => Gluten [1] => Sesame )

// 示例2:数据库值96(十六进制60)
$labels2 = getAllergenLabels(96, $allergens);
print_r($labels2);
// 输出:Array ( [0] => Fish [1] => Gluten )

// 示例3:数据库值320(十六进制140)
$labels3 = getAllergenLabels(320, $allergens);
print_r($labels3);
// 输出:Array ( [0] => Gluten [1] => Milk )

逻辑说明

每个过敏原的value对应二进制中唯一的1位(比如Gluten的0x40是二进制1000000,Sesame的0x4000是二进制10000000000000),数据库存储的数值是这些位的组合(累加或按位或)。通过$dbValue & $allergen['value']操作,若结果不为0,说明该位在目标数值中是1,即包含对应的过敏原。

内容的提问来源于stack exchange,提问作者sunnyj58

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:33:18