PHP foreach循环中数组仅存入最后一个值的问题排查
问题分析与解决方案
嘿,问题很明显啦——你在循环里每次都重新创建了$nieuweTijden数组,而不是往里面添加新元素!
错误原因
看这段代码:
$nieuweTijden = array($label=>$rondeTijden);
每次进入if判断时,你都把$nieuweTijden赋值成一个只包含当前$label和$rondeTijden的新数组,之前循环添加的元素全被覆盖了,最后自然只剩最后一个符合条件的值。
修正步骤
- 先在循环外初始化数组:在第一个
foreach循环之前,先创建一个空数组$nieuweTijden = [];(或者array(),两种写法都可以)。 - 往数组里追加元素:把原来的赋值语句改成
$nieuweTijden[$label] = $rondeTijden;,这样每次循环都会把新的键值对添加到数组里,而不是覆盖整个数组。 - 处理空数组的情况:如果没有任何符合条件的元素,第二个
foreach循环会报错,所以可以先判断数组是否非空再循环输出。
修正后的完整代码
// 先初始化空数组 $nieuweTijden = []; $alleTijden = array( "ma_v" => $_POST['maandag_van'], "ma_t" => $_POST['maandag_tot'], "di_v" => $_POST['dinsdag_van'], "di_t" => $_POST['dinsdag_tot'], "wo_v" => $_POST['woensdag_van'], "wo_t" => $_POST['woensdag_tot'], "do_v" => $_POST['donderdag_van'], "do_t" => $_POST['donderdag_tot'], "vr_v" => $_POST['vrijdag_van'], "vr_t" => $_POST['vrijdag_tot'], "za_v" => $_POST['zaterdag_van'], "za_t" => $_POST['zaterdag_tot'], "zo_v" => $_POST['zondag_van'], "zo_t" => $_POST['zondag_tot'] ); foreach($alleTijden as $label => $tijden) { $tijd = explode(":", $tijden); // 优化判断逻辑:先确保数组元素存在,再检查非空 if(isset($tijd[0], $tijd[1]) && $tijd[0] !== '' && $tijd[1] !== '') { $uur = $tijd[0]; $minuten = $tijd[1]; $rondeTijden = round_hour($uur, $minuten); // 追加元素到数组,而非重新创建数组 $nieuweTijden[$label] = $rondeTijden; } } // 判断数组非空再输出,避免无数据时报错 if(!empty($nieuweTijden)) { foreach($nieuweTijden as $label => $tijden) { echo $label.':'.$tijden.'<br>'; } }
额外优化提示
原来的count($tijd[0]) != 0判断有点冗余,直接用$tijd[0] !== ''更直观;同时加上isset($tijd[0], $tijd[1]),可以避免explode分割后结果不足两个元素时出现Undefined offset的错误。
内容的提问来源于stack exchange,提问作者Rick A.
相关产品推荐
相关产品推荐

