【问题标题】:Regarding array_intersect关于array_intersect
【发布时间】:2014-02-05 12:14:36
【问题描述】:

我有 2 个数组。一个使用来自 Moodle 的用户名($allUsers),另一个使用来自外部源的用户名($dataClip)。如果尚未注册,我需要比较它们并批量添加它们。

function buildURL($year, $period, $typeperiod,$course)
{
return 'https://clip.unl.pt/sprs?lg=pt&year='.$year.'&uo=97747&srv=rsu&p='.$period.'&tp='.$typeperiod.'&md=3&rs='.$course.'&it=1030123459';
}

function doRequest_with_FileGetContents($url)
{
return file_get_contents($url);
}

function getallUsers(){
global $DB;
$allusers=array();
$users= $DB->get_records('user');
foreach($users as $user){
$allusers[]= $user->username."<br/>";

}
return $allusers;
}
function processXML($xmlContent){
$xmlObj= new SimpleXMLElement($xmlContent);
$result=array();
foreach($xmlObj->unidade_curricular->inscritos->aluno as $aluno){
$result[]= $aluno->identificador."<br/>";

}
return $result;
}

$allUsers= getallUsers();
$dataClip= processXML($content_b);
$courseid= required_param('id', PARAM_INT); 
$context= get_context_instance(CONTEXT_COURSE, $courseid);//Getting students who are already enrolled                                                     
$students= get_role_users(5,$context);

if(is_array($dataClip)){ //eliminates warnings of Invalid Argument supplied in foreach
foreach($dataClip as $newdata){
    $duplicate=false;
    if(is_array($allUsers)){
    foreach($allUsers as $dataMoodle){
        // if there is a match
        if($newdata==$dataMoodle){
            // if student is enrolled on moodle course page.
           if($students){
           $duplicate=true;
        continue;
            }
    else {
        $duplicate=false;
        $results=array_intersect((array)$newdata,(array)$dataMoodle); // complains about not being an array
        //print_r($results);
        echo implode('<br/>',$results);
}

else{
    $duplicate= false;
    continue;
    } 
}
}
}
}

array_intersect 为我提供了两个数组之间的通用用户名,但是当我将其中一个添加到我的课程页面时,我没有得到任何输出。所以,就像 abc 和 ab 之间的交集是 [] 而不是 ab。

编辑:dataCLIP 有 300 多个名称,但其中有

a.maia

a.cabral

d.mateus

这是所有来自 Moodle 的用户

客人

管理员

xpto.xy

a.maia

d.mano

a.cabral

d.mateus

我的逻辑哪里出错了?

【问题讨论】:

  • 您能否解释一下您的代码:如果 $allUsers 和 $dataClip 是用户名数组(字符串,对吗?),那么您的 foreach 循环中的 $newdata 和 $dataMoodle 中包含什么?
  • 我想我不明白为什么您在开始 foreachs 之前不比较数组。为什么不首先查找并删除重复项(或使用 array_diff 查找唯一项),如果这给您一个非空数组处理那些?
  • @S Korolev allUsers 是一个让我获得所有 Moodle 用户的功能。 dataClip 是一个函数,它可以从 url 获取名为 Identificador 的标记内的所有值。我也会发布方法和网址
  • 当您将所有内容都转换为标量并且您已经知道它们不是重复项时,为什么还要执行 array_intersect?为什么不 $results[] = $newData; ?您还介意修正缩进吗?
  • @Elin 我需要确保两个数组之间存在重复,因为我想将在 Moodle 上注册的学生添加到课程页面。如果用户已经在该课程页面上注册,我会跳过他并转到下一个。如果与 ABC 相交,我想看到 ABC。但是如果 A 已经注册了课程,我希望看到 BC,而不是 []。

标签: php moodle array-intersect


【解决方案1】:

对于注册用户,您可能需要查看 /lib/enrollib.php 中的函数 enrol_user_bulk(stdClass $instance, $userids, ...)

类似的东西

$plugin = enrol_get_plugin('manual');
$courses = ... // get the distinct course ids
foreach ($courses as $course) {
    $instance = $DB->get_record('enrol', array('courseid' => $courseid, 'enrol' => 'manual');
    $userids = ... // get userid's to enrol on this course
    $plugin->enrol_user_bulk($instance, $userids) 
}

【讨论】:

  • 您好,/lib/enrollib.php 中没有 enrol_user_bulk 方法。也许它已被弃用?我正在使用 Moodle 2.5。还是您的意思是 enrol_user 功能?有什么方法可以使用我存储在数组中的用户名而不是用户 ID 来注册他们?
  • 啊,刚刚意识到该功能是 Totara 的一部分,而不是 Moodle - Moodle HQ github 上有该功能的副本 - github.com/moodlehq/totara/blob/t2-release-2.5/lib/enrollib.php - 几乎大部分 Moodle 都在 ID 上工作,所以你需要使用 ID 而不是用户名。
  • 好的,谢谢。打算深入研究,可能在接下来的几天内发布一个新帖子。
  • 当你在那里时,你可能想看看 Totara Sync - github.com/moodlehq/totara/tree/t2-release-2.5/admin/tool/… - 它使用 csv 文件或数据库表来同步用户
  • 我在您提供的第一个 totara 链接的 lib/enrollib.php 中的 enrol_bulk_user 方法上看到了一个函数调用 insert_records_via_batch。这是哪里来的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2017-04-21
  • 2011-07-31
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多