如何在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
相关产品推荐
相关产品推荐

