$rows) {
// 1. Sort by date desc
usort($rows, function($a, $b) {
return strcmp($b['ts'], $a['ts']);
});
// 2. Keep max 2
if (count($rows) > 2) {
$rows = array_slice($rows, 0, 2);
}
$names = []; $inerrs = []; $vfcs = []; $vios = [];
$clintids = []; $fcnames = []; $tss = []; $vioerrs = [];
$hasError = false;
$maxVioErr = 0;
foreach ($rows as $r) {
if ($r['inerr'] != 0 && $r['inerr'] != '0') $hasError = true;
// Track VIOErr
$errVal = (int)($r['VIOErr'] ?? 0);
if ($errVal > $maxVioErr) $maxVioErr = $errVal;
// Format VIOErr for display (Red badge if > 0)
$vioerrs[] = ($errVal > 0) ? "$errVal" : $errVal;
$names[] = $r['name'] ?? '-';
$inerrs[] = $r['inerr'] ?? '-';
$vfcs[] = $r['vfcclientname'] ?? '-';
$vios[] = $r['vio'] ?? '-';
$clintids[] = $r['clintid'] ?? '-';
$fcnames[] = $r['fcname'] ?? '-';
$tss[] = $r['ts'] ?? '-';
}
$displayRows[] = [
'clintname' => $clientKey,
'hasError' => $hasError,
'maxVioErr' => $maxVioErr,
'name' => implode('
', $names),
'inerr' => implode('
', $inerrs),
'vfc' => implode('
', $vfcs),
'vio' => implode('
', $vios),
'clintid' => implode('
', $clintids),
'fcname' => implode('
', $fcnames),
'ts' => implode('
', $tss),
'vioerr' => implode('
', $vioerrs),
];
}
// 4. Final Sort: 1. Warning (inerr), 2. VIOErr > 0, 3. Alpha
usort($displayRows, function($a, $b) {
// Priority 1: InErr (table-warning)
if ($a['hasError'] && !$b['hasError']) return -1;
if (!$a['hasError'] && $b['hasError']) return 1;
// Priority 2: VIOErr count
if ($a['maxVioErr'] > 0 && $b['maxVioErr'] == 0) return -1;
if ($a['maxVioErr'] == 0 && $b['maxVioErr'] > 0) return 1;
if ($a['maxVioErr'] != $b['maxVioErr']) return $b['maxVioErr'] - $a['maxVioErr'];
// Priority 3: Alphabetical
return strcasecmp($a['clintname'], $b['clintname']);
});
?>
VIO Monitoring
| Clint Name |
Name |
VIOErr |
InErr |
VFC Client Name |
VIO |
ClintID |
FC Name |
Last Update |
|
|
|
|
|
|
|
|
|