PHP中如何在switch参数部分使用多值?代码异常求助
PHP Switch参数多值实现 + 数组空值异常解决
一、Switch参数用多个值的实现方法
你要的是让switch的判断参数同时匹配多个值(和Stack Overflow那篇case多值的用法相反),但PHP原生switch只支持单一值匹配,所以可以用以下两种变通方式:
方式1:结合in_array做布尔判断
把需要匹配的多个值放进数组,用in_array()返回的布尔值作为switch的判断参数:
// 示例:判断$class[$i]是否属于['middle', 'top'] switch (in_array($class[$i], ['middle', 'top'])) { case true: $parallaxDir[$i] = '0'; break; default: $parallaxDir[$i] = '9'; break; }
方式2:用逻辑或拼接表达式
如果值不多,直接用||拼接成布尔表达式:
switch ($class[$i] == 'middle' || $class[$i] == 'top') { case true: $parallaxDir[$i] = '0'; break; default: $parallaxDir[$i] = '9'; break; }
如果是多组值的判断,其实用if-elseif更直观,比switch写起来更简洁:
if (in_array($class[$i], ['middle', 'onright'])) { $parallaxDir[$i] = '0'; } elseif (in_array($class[$i], ['top', 'onleft'])) { $parallaxDir[$i] = '1'; } else { $parallaxDir[$i] = '9'; }
二、数组值莫名为空的问题修复
你说parallaxDir[1]在empty()判断里返回空,但实际不是空,移除[1]就正常,问题根源在这两个点:
1. empty()对字符串'0'的误判
你代码里parallaxDir[$i]的取值有'0',而PHP的empty('0')会返回true(字符串'0'被empty视为空值),所以当parallaxDir[1]是'0'时,if(!empty($parallaxDir[1]))会不成立,不会输出属性。
而移除[1]后,empty($parallaxDir)判断的是整个数组是否为空,只要数组有元素就返回false,所以会执行echo。
解决方法:换掉empty(),改用精准判断:
// 检查索引存在且值不为空字符串 <?php if(isset($parallaxDir[1]) && $parallaxDir[1] !== '') { echo 'data-para-dir="' . $parallaxDir[1] . '"'; } ?> // 或者直接判断不是默认值'9' <?php if(isset($parallaxDir[1]) && $parallaxDir[1] !== '9') { echo 'data-para-dir="' . $parallaxDir[1] . '"'; } ?>
2. 数组索引可能不存在
如果$three解码后的元素数量不足2个(比如只有1张图),$parallaxDir[1]根本不存在,empty()也会返回true。加个isset()先判断索引是否存在,避免报错或误判。
3. 优化遍历逻辑(可选)
手动累加$i容易出错,改用foreach的键值对写法更安全,索引和$three的元素一一对应:
$imgs = $parallax = $class = $parallaxDir = []; foreach ($three as $key => $img) { $imgs[$key] = $img->Image; $parallax[$key] = $img->Transition; $class[$key] = $img->Class; if (in_array($class[$key], ['middle', 'onright'])) { $parallaxDir[$key] = '0'; } elseif (in_array($class[$key], ['top', 'onleft'])) { $parallaxDir[$key] = '1'; } else { $parallaxDir[$key] = '9'; } }
内容的提问来源于stack exchange,提问作者GibsonFX
相关产品推荐
相关产品推荐

