Обработка ошибок php foreach в функции

У меня есть функция, которая выполняет цикл foreach в массиве из базы данных.

см. foreach ($teamarray AS $key => $value){$teamgo .= $value[1]." ".$value[2]."<br/>";

Проблема в том, что иногда не может быть набора данных, который вызывает ошибку, когда цикл попадает в это поле.

Как я могу поймать / подавить эту ошибку?

 function GetUnsubmitted($coach){ $push .= "<div id=unsubmitted><h2>Check which event/teams you want to process and click submit</h2>"; $push .= "<form action=\"submit.php\" method=POST>"; $result = mysql_query("SELECT * FROM `ptable` WHERE coach = '$_SESSION[username]' AND status = '1' ORDER BY status ASC") or trigger_error(mysql_error()); while($row = mysql_fetch_array($result)){ foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } $id = $row['id']; $teampre = $row['team']; $eventpre = $row['event']; $statuspre = $row['status']; $eventarray = DecodeEvent($eventpre); $event = $eventarray[0]; $cat = $eventarray[1]; $subcat = $eventarray[2]; $division = $eventarray[3]; $type = $eventarray[4]; $teamarray = DecodeTeam($teampre); $price = GetPrice($type, "nat"); $teamcount = count($teamarray); $total = $price * $teamcount; $teamgo = ""; foreach ($teamarray AS $key => $value){ $teamgo .= $value[1]." ".$value[2]."<br/>"; if($statuspre == "1"){ $statuscolor = "#FFCC99"; $statusmsg = "unsubmitted <a href=delsub.php?id=$id onClick=\"return confirm('Are you sure you want to delete this submission?');\"><img src=images/del.png border=0 />"; } elseif($statuspre == "2"){ $statuscolor = "#FFCC66"; $statusmsg = "awaiting confirmation"; } elseif($statuspre == "3"){ $statuscolor = "#66CC66"; $statusmsg = "confirmed"; } } $push .= "<div id=submission><div id=event style=\"background-color:$statuscolor;\"><h1>$event</h1><span id=status>$statusmsg</span></div><div id=subinfo><a href=\"#\" onClick=\"if($(this).next('div').css('display') == 'none') { $(this).next('div').show('fast'); } else { $(this).next('div').hide('fast'); } return false;\"><span id=dropdown><img src=images/expand.png border=0></span><h2>$cat >> $subcat >> $division >> $type</h2></a> <div id=team style=\"display:none;\">$teamgo<br />$price - $total<div id=controls></div></div></div></div>"; $pid .= $id; $rtotal .= "$total,"; } $stotal = explode(",", $rtotal); $gtotal = array_sum($stotal); $push .= "<div style=\"text-align:right;\"><div id=total>Total - <em>$gtotal</em></div><br><input type=image src=images/paynow.png alt=\"Pay Now\"></form> <a href=submit2.php?$pid&$pidarray><img src=images/mailfax.png width=138px height=41px border=0></a></div></div>"; return $push; } 

Если возможно, id нравится, чтобы сказать «нет команды выбрали» и остановиться.

 if ($array) { foreach ($array as $k => $v) { ... } } else { echo 'No team selected'; // exit from loop } 

Ваш выход из цикла будет «возвратом» или «break n» (n – уровни, которые нужно сломать) или продолжить … это зависит от вашей логики.

Вы можете написать так:

 foreach ((array)$teamarray as $key => $value) { $teamgo .= $value[1] . " " . $value[2] . "<br/>"; //... } 

foreach ожидает массив . Таким образом, действительно правильный способ – убедиться, что вы имеете дело с массивом, прежде чем пытаться выполнить итерацию, например:

 if (is_array($teamarray) && count($teamarray)) { foreach ((array)$teamarray as $key => $value) { $teamgo .= $value[1] . " " . $value[2] . "<br/>"; //... } } 

Вы также можете проверить is_iterable с PHP 7.1.

 if ($value !== null && count($value) >= 3) { $teamgo .= $value[1] . $value[2] } 

<вставить озадаченный смайлик здесь>

 foreach($row AS $key => $value) { if ($value) { $row[$key] = stripslashes($value); } } 

А также:

 foreach ($teamarray AS $key => $value){ if ($value && sizeof($value) > 2) { $teamgo .= $value[1] . $value[2] } } 

Это так?

Просто выполните тест, если $teamarray самом деле является массивом:

 if (is_array($teamarray)) { foreach ($teamarray as $key => $value) { // … } } 

Или вы могли бы сделать:

 $teamarray = isset($teamarray) ? $teamarray : array(); 

Прямо перед циклом в хорошей аккуратной строке, и это гарантирует, что у вас есть переменная, установленная в пустой массив, который заставит ее пропустить foreach() .