我必须根据一个值执行多组指令,例如。
$value = 'AA';
switch ($value) {
case 'AA':
echo "value equals 1";
continue;
case 'BB':
echo "value equals 2";
continue;
case 'CC' || 'AA':
echo "value equals 3";
break;
}
我对上述代码的期望是它应该根据传递的值执行多个案例,变量$ value包含AA
作为值,因此我希望它能够执行这两个
case 'AA'
和
case 'CC' || 'AA'
因此它应该打印出value equals 1 value equals 3
但是它不执行它,因为我只获得value equals 1
作为输出。如果我从语句中删除continue
,它会执行逻辑上错误的所有三个cases
。 PHP的switch语句是否支持基于单个值执行多个案例?对此有什么解决方法吗?
答案 0 :(得分:12)
如果缺少break
,则switch
语句会导致下一个条件:
$value = 'AA';
switch ($value) {
case 'AA':
echo "value equals 1"; // this case has no break, enables fallthrough
case 'CC':
echo "value equals 3"; // this one executes for both AA and CC
break;
case 'BB':
echo "value equals 2";
break;
}
答案 1 :(得分:3)
switch
语句需要案例块中的文字。请改用if
语句。
您可以通过值使用其他种类的循环到iterate
,然后使用IF
进行比较。在switch
个案例中无法进行比较/条件检查。
实现你想要做的事情的一种方法就是这样(注意使用IF):
$value = 'AA';
switch($value)
{
case ('AA'):
echo "value equals 1<br />";
case ('BB'):
if ($value == 'BB'){
echo "value equals 2<br />";
}
case (('AA') || ('CC')):
echo "value equals 3<br />";
break;
}
<强>输出:强>
value equals 1
value equals 3
注意: - 上述解决方案不正确,但输出您需要的不是正确的解决方案,如果可能,我建议避免。您可以使用非开关/案例替代方案轻松修复您的需求。
答案 2 :(得分:1)
解决方法是使用一组if
和else if
语句。不评估case
语句中的条件。
if($value == 'AA') {
echo "value equals 1";
}
else if($value == 'CC') {
echo "value equals 3";
}
else { //Or else if($value == 'BB') if you might add more at some point
echo "value equals 2";
}
continue
(或break
语句)结束每个case
。如果省略,则执行将落到下一个case
(这就是为什么所有三个都在你的情况下执行 - 它落在所有这些中,直到最后。如果是continue
或{在break
遇到{1}},执行将停在那里。
答案 3 :(得分:0)
在阅读文档后,我看到switch语句可能有多个案例,它们评估为true,但不是多个案例块,它们评估为真。
此外,文档指出break;
范围内的continue;
和switch
是等效的。
如果您遗漏所有break;
和continue;
语句,您会看到无论是否匹配,它们都会打印出来。对于这个难题,你必须使用不太酷的if / else / ifelse语句。
答案 4 :(得分:0)
您需要像这样编写代码 当我们检查多个条件时,我们需要在那里添加条件语句。
$value = 'AA';
switch ($value) {
case 'AA':
echo "value equals 1";
continue;
case 'BB':
echo "value equals 2";
continue;
case $value == 'CC' || $value=='AA':
echo "value equals 3";
break;
}
或者您可以简单地以这种格式编写代码(为此添加两种不同的情况)
$value = 'AA';
switch ($value) {
case 'AA':
echo "value equals 1";
continue;
case 'BB':
echo "value equals 2";
continue;
case 'CC':
case 'AA':
echo "value equals 3";
break;
}
答案 5 :(得分:-2)
CREATE OR ALTER PROCEDURE [dbo].[spCargarDatosCC]
AS
BEGIN
SET NOCOUNT ON;
-- VARIABLES --
DECLARE @CCobro xml
BEGIN TRY
--Insercion de los tipos de documentos de identificacion
SELECT @CCobro = CC
FROM OPENROWSET (Bulk 'D:\Base de datos\FacturacionMunicipal_BD\Base de Datos\XML\Concepto_de_Cobro.xml', Single_BLOB) AS CCobro(CC)
INSERT INTO CCobro (ID, Nombre, TasaInteresMoratorio, DiaEmisionRecibo, QDiasVencimiento, EsImpuesto, EsRecurrente, EsFijo, TipoCC, Activo)
SELECT c.value('@id','INT') AS ID
, c.value('@Nombre','VARCHAR(100)') AS Nombre
, c.value('@TasaInteresMoratoria','DECIMAL(10,2)') AS TasaInteresMoratorio
, c.value('@DiaCobro','TINYINT') AS DiaEmisionRecibo
, c.value('@QDiasVencimiento','TINYINT') AS QDiasVencimiento
, c.value('@EsImpuesto','VARCHAR(10)') AS EsImpuesto
, c.value('@EsRecurrente','VARCHAR(10)') AS EsRecurrente
, c.value('@EsFijo','VARCHAR(10)') AS EsFijo
, c.value('@TipoCC','VARCHAR(10)') AS TipoCC
, 1 AS Activo
FROM @CCobro.nodes('/Conceptos_de_Cobro/conceptocobro') AS t(c);
END TRY
BEGIN CATCH
return @@ERROR * -1
END CATCH
END