我正在尝试做一些会传输hexa do binary的程序。问题是将A,B,C,..,F更改为10,11,12,...,15因此我可以像使用数字一样使用它们。我做了这个功能:
function odstran_pismena($pole)
{
$dlzka = count($pole);
for ($i = 0; $i< $dlzka; $i++)
switch ($pole[$i])
{
case 0: break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;
case ("A" || "a"): $pole[$i] = 10;
break;
case ("B" || "b"): $pole[$i] = 11;
break;
case ("C" || "c"): $pole[$i] = 12;
break;
case ("D" || "d"): $pole[$i] = 13;
break;
case ("E" || "e"): $pole[$i] = 14;
break;
case ("F" || "f"): $pole[$i] = 15;
break;
default: $pole[$i] = "ERROR";
break;
}
return $pole;
}
首先我从字符串制作数组,现在我想将字母改为数字。
我正在使用此字符串对其进行测试:$test = "AbCdEf2345";
我期待的结果是10 11 12 13 14 15 2 3 4 5但我所有的都是10 10 10 10 10 10 2 3 4 5
我做了一些mystake吗?(我当然是,但在哪里?)
答案 0 :(得分:1)
(“A”||“a”)计算为布尔值'true',因此所有a到f都会被案例捕获(“A”||“a”)并导致10。
不使用hexdec()并且对代码进行最小的更改:
function odstran_pismena($pole)
{
$dlzka = count($pole);
for ($i = 0; $i< $dlzka; $i++)
switch ($pole[$i])
{
case 0: break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;
case "A":
case "a": $pole[$i] = 10;
break;
case "B":
case "b": $pole[$i] = 11;
break;
case "C":
case "c": $pole[$i] = 12;
break;
case "D":
case "d": $pole[$i] = 13;
break;
case "E":
case "e": $pole[$i] = 14;
break;
case "F":
case "f": $pole[$i] = 15;
break;
default: $pole[$i] = "ERROR";
break;
}
return $pole;
}
答案 1 :(得分:0)
指定case ("A" || "a"): $pole[$i] = 10;
后,评估为true
。因此,与true
匹配的所有字符都返回true。对于'case'条件避免使用表达式。使用比较的静态值,例如
case "A":
case "a":
$pole[$i] = 10;
break;
答案 2 :(得分:0)
帮助您的一个简单方法是使用strtolower:
switch(strtolower($pole[$i])) {
case "a" :...
break;
case "b": ...
break;
}
或简单地说,作为你职能的第一行:
$pole = strtolower($pole);
这样您就不必费心上/下壳。
答案 3 :(得分:0)
您应该使用hexdec()
并将整个for
循环替换为:
for ($i = 0; $i< $dlzka; $i++)
{
$pole[$i] = hexdec($pole[$i]);
}
请注意,您将收到0
的无效值,因此您可能需要单独检查它是否可能发生,例如使用原始值is_numeric
。