function json_getSubGroups()
 {
     $sFilter = KTUtil::arrayGet($_REQUEST, 'filter', false);
     $aAllowedGroups = array('off' => _kt('-- Please filter --'));
     if ($sFilter && trim($sFilter)) {
         $iGroupID = KTUtil::arrayGet($_REQUEST, 'group_id', false);
         if (!$iGroupID) {
             return array('error' => true, 'type' => 'kt.invalid_entity', 'message' => _kt('An invalid group was selected'));
         }
         $oGroup = Group::get($iGroupID);
         $aMemberGroupsUnkeyed = $oGroup->getMemberGroups();
         $aMemberGroups = array();
         $aMemberIDs = array();
         foreach ($aMemberGroupsUnkeyed as $oMemberGroup) {
             $aMemberIDs[] = $oMemberGroup->getID();
             $aMemberGroups[$oMemberGroup->getID()] = $oMemberGroup;
         }
         $aGroupArray = GroupUtil::buildGroupArray();
         $aAllowedGroupIDs = GroupUtil::filterCyclicalGroups($oGroup->getID(), $aGroupArray);
         $aAllowedGroupIDs = array_diff($aAllowedGroupIDs, $aMemberIDs);
         $aAllowedGroups = array();
         foreach ($aAllowedGroupIDs as $iAllowedGroupID) {
             $g = Group::get($iAllowedGroupID);
             if (!PEAR::isError($g) && $g != false) {
                 $aAllowedGroups[$iAllowedGroupID] = $g->getName();
             }
         }
     }
     return $aAllowedGroups;
 }
<?php

require_once "../../../config/dmsDefaults.php";
require_once KT_LIB_DIR . '/groups/GroupUtil.php';
$aGroupMembers = array(1 => array(2, 3, 4), 2 => array(), 3 => null, 4 => array(5), 5 => null, 6 => array(1), 7 => array(2, 3));
$iGroupID = 5;
$aRet = GroupUtil::filterCyclicalGroups($iGroupID, $aGroupMembers);
sort($aRet);
$aExpectedResult = array(2, 3, 7);
if ($aRet === $aExpectedResult) {
    print "Success!\n";
} else {
    print "Failed!\n";
    print "Expected: " . print_r($aExpectedResult, true);
    print "Got: " . print_r($aRet, true);
}