packageName] = $tallies[$task->packageName] ?? 0; $tallies[$task->packageName]++; } $buf = ''; foreach ($tallies as $package => $tally) { if ($tally === 1) { $buf .= sprintf( " - %s has %d task\n", $package, $tally ); } else { $buf .= sprintf( " - %s has %d task(s)\n", $package, $tally ); } } return $buf; } /** * Make a table displaying a list of tasks. * * @param Task[] $tasks * @param string[] $fields * List of fields/columns to display. * Some mix of: 'active', 'id', 'packageName', 'title', 'action' * @return string */ public static function formatTaskTable($tasks, $fields) { $availableHeaders = ['active' => '', 'id' => 'ID', 'packageName' => 'Package', 'title' => 'Title', 'action' => 'Action']; $header = []; foreach ($fields as $field) { $header[] = $availableHeaders[$field]; } $fmtRun = function ($run) { return sprintf('@%s %s', $run['type'], $run['code']); }; $makeMainRow = function (Task $task, $runExpr) use ($fields) { $row = []; foreach ($fields as $field) { switch ($field) { case 'active': $row[] = $task->active ? '+' : '-'; break; case 'action': $row[] = $runExpr; break; default: $row[] = $task->{$field}; break; } } return $row; }; $makeExtraRow = function (Task $task, $runExpr) use ($fields) { $row = []; foreach ($fields as $field) { switch ($field) { case 'action': $row[] = $runExpr; break; default: $row[] = ''; break; } } return $row; }; $rows = []; foreach ($tasks as $task) { /** @var Task $task */ if (in_array('action', $fields)) { foreach ($task->getParsedRun() as $n => $run) { $maker = ($n === 0) ? $makeMainRow : $makeExtraRow; $rows[] = $maker($task, $fmtRun($run)); } } else { $rows[] = $makeMainRow($task, null); } } return TableHelper::formatTable($header, $rows); } } __halt_compiler();----SIGNATURE:----GVT/9kUm0QuIHlARY4g4tdpOnqaLeQsiU3Dtjn2Y13jyIdr0MSpkeNxyH7irY06EUKDx5SjiEYxfdwMhbi8zw/cL9KPs+z7SxGeRdPMtMqKpB1aR4ubnxUdynbz9qZSo1tKxWka+jkv0TDeKorH0Hdb+7UhqtPg7AW4ITRBFzwmrp8riV+EJEf1Brs01RctDBTTocSMf0WOHBzRUCwho1r0zPtkIRJSljFsSIer08qUDefnsh/zDmDSAaFvpLfupRklfLhfcmpC+st/cz9IOlqTVdhkE0+axg9zfUfMG2qTj7ZuXAblQn+4Twa9+rp2i+pbuTeX/yAvWgp52sL+ET0iN3CkANGOnphOQufRtp+gdXoGywFF8Mf1gNOIJU8NL16rPhoIagAsW7SzQs//V/j31gq3iRPqH1HVomEyNGel4oYa08JHVs12b30XxMva9l991OtcoSYg1W0fBbdLS3N4STlLpLL3fsfK8ZE9mnu6LJqSkclKYKcGP+vn8JXq4+u7wuIBqB6tdUswgZUz9/B3tsuI5AKW15Nho8OeHNEXC51rvG3at2imlUIo6DjEYCcvsPfD3OZdcy+u7GlNcXo0yb+38S/RvhzqSNrg+nvaKV9tUPdh88g8cpcSw3UWiNQFfHwRC9qY8UoBSIdVY5SfzBRsKTJbGt9LRq8gzKWY=----ATTACHMENT:----Nzc0MzI2MDA1ODY3NTg1OCA5NDQwMDg1NzE1OTc4NjM2IDQ5OTA3MDg3NDk2OTI1MTk=