$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']); }); ?>

Clint Name VIOErr InErr VFC Client Name VIO ClintID FC Name