query( "SELECT mdl_grade_items.id, itemname, calculation, courseid, fullname, shortname FROM mdl_grade_items JOIN mdl_course ON mdl_course.id = mdl_grade_items.courseid WHERE itemtype = 'course' AND TRIM(calculation) <> ''" ); // Regular expression to match the item placeholders and percentages $pattern = '/(\d*\.?\d*)\s?\*\s?##gi(\d+)##|##gi(\d+)##\s?\*\s?(\d*\.?\d*)/'; $grade_items = array_map(function ($item) use ($moodle_db, $pattern) { $matches = []; preg_match_all($pattern, $item['calculation'], $matches, PREG_SET_ORDER); $porcentaje = array_map(function ($match) use ($moodle_db) { $percentage = $match[1] ?: $match[4]; $itemid = $match[2] ?: $match[3]; $item_name = $moodle_db ->where('id', $itemid) ->getOne('mdl_grade_items', ['itemname', 'idnumber']); return [ 'itemid' => intval($itemid), 'percentage' => floatval($percentage), 'item_name' => is_null($item_name) ? 'No encontrado' : ($item_name['itemname'] ?: $item_name['idnumber']), 'tipo_item' => ($item_name['itemname'] ?? null) ? 'Actividad única' : 'categoría', ]; }, $matches); return [ 'id' => $item['id'], 'calculation' => $item['calculation'], 'courseid' => $item['courseid'], 'fullname' => $item['fullname'], 'shortname' => $item['shortname'], 'porcentaje' => $porcentaje, 'suma_porcentaje' => # redondeo de 3 decimales round(array_sum(array_column($porcentaje, 'percentage')), 2), ]; }, $grade_items); // Output the result as JSON header('Content-Type: application/json'); # filter where suma porcentaje is less than 1 $grade_items = array_filter($grade_items, function ($item) { return $item['suma_porcentaje'] < 1; }); echo json_encode($grade_items, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);