PHP循环遍历数组并结合switch语句处理元素的问题求助
PHP循环遍历数组并结合switch语句处理元素的问题求助
嗨,我来帮你搞定这个问题~
你之前的代码为啥总是输出unknown呢?核心问题是你把整个数组$hold直接传给switch了,switch需要的是数组里的单个元素值,而不是整个数组对象,所以它匹配不到任何case,只能走default啦。
想要实现遍历数组每个元素并输出对应消息,你需要先把数组里的元素逐个取出来,再交给switch处理。这里给你两种常用的写法:
方法一:用foreach循环(推荐,更简洁)
foreach是PHP里遍历数组最常用的方式,它会自动逐个取出数组里的元素:
$hold = array('warning','warning','critical','ok'); // 遍历数组,每个元素赋值给$status变量 foreach ($hold as $status) { switch($status) { case 'ok': echo 'everything is ok<br>'; break; case 'warning': echo 'it is a warning<br>'; break; case 'critical': echo 'its critical<br>'; break; default: echo 'unknown<br>'; } }
这样运行的话,数组里的每个元素都会被单独判断,warning出现两次就会输出两次"it is a warning",完全符合你的需求。
方法二:用for循环(需要手动控制索引)
如果你习惯用for循环,也可以先获取数组长度,再通过索引逐个取出元素:
$hold = array('warning','warning','critical','ok'); // 获取数组的元素个数 $arrayLength = count($hold); // 从索引0开始遍历到最后一个元素 for ($i = 0; $i < $arrayLength; $i++) { // 取出当前索引对应的元素 $status = $hold[$i]; switch($status) { case 'ok': echo 'everything is ok<br>'; break; case 'warning': echo 'it is a warning<br>'; break; case 'critical': echo 'its critical<br>'; break; default: echo 'unknown<br>'; } }
这个写法和foreach的效果完全一样,只是需要手动处理数组索引而已。
额外小技巧:用关联数组简化逻辑
如果你的需求只是状态和消息的一一映射,其实可以不用switch,直接用关联数组来实现,代码会更简洁:
$hold = array('warning','warning','critical','ok'); // 定义状态和对应消息的映射数组 $statusMessages = array( 'ok' => 'everything is ok', 'warning' => 'it is a warning', 'critical' => 'its critical' ); foreach ($hold as $status) { // 检查当前状态是否有对应的消息,没有就输出unknown echo isset($statusMessages[$status]) ? $statusMessages[$status] . '<br>' : 'unknown<br>'; }
这种方式在状态和消息对应关系简单的时候非常好用,不过如果每个状态需要执行更复杂的逻辑,还是switch更合适。
备注:内容来源于stack exchange,提问作者NewCoder
相关产品推荐
相关产品推荐

