微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查两个数组是否具有相似的键并打印第二个数组的值如果它们不匹配跳一个单元格

如何解决检查两个数组是否具有相似的键并打印第二个数组的值如果它们不匹配跳一个单元格

我有两个数组,一个数组包含从数据库提取的所有键,第二个数组包含第一个数组中的某些键。 (第一个数组包含一个学生应该就读的所有科目的数据,第二个数组包含如果学生没有坐在纸上的某些关键信息和特定学科的分数。)

数组看起来像这样。

这是第一个数组

$getAllSubjects($class_id) = {210,221,222,223};

第二个数组。

$subjectIDs = {210 => 20,223 => 9}

该学生完成了四个科目(第一个数组)中的两个科目(第二个数组)。

我的目标是在两个数组上都存在键匹配的情况下,从第二个数组中打印值(标记)。

我已经尝试在内置函数in_array()中使用PHP并产生结果,但是如果键不匹配,我希望它会跳一个单元格,因为我正在使用tcpdf生成PDF。

 foreach ($results_ as $row) {


        $smarks = $row['mar'];
        $integerIDs = explode(',',$smarks);
        asort($integerIDs);

        // ---------------------------------------------------------------------
        $subjects_ = $row['subjects_'];
        $subjectIDs = explode(',$subjects_);
        asort($subjectIDs);

        $subject_count = count($subjectIDs);

        $average = round($row['m'] / $subject_count,2);

        $total_subject_marks = $exam_out_of * $subject_count;

        $SubjectPercentage = round(($row['m'] / $total_subject_marks) * 100);
        // ----------------------------------------------------------------------

        $pdf->Cell($width_cell[5],7,$row['s'],$border=1,$ln=0,'C',$fill=$fill,$link='',$stretch=0,$ignore_min_height=false,$calign='T',$valign='R');
        $pdf->Cell($width_cell[2],$row['FirstName'] . " " . $row['OtherNames'] . " " . $row['LastName'],'L',$valign='R');
        $pdf->Cell($width_cell[4],$row['RollId'],$valign='R');

            for($i=0; $i < count(getAllSubjects($class_id)); $i++){
                if(in_array($subjectIDs[$i],getAllSubjects($class_id))){
                    $pdf->Cell($width_cell[4],$integerIDs[$i],$fill=true,$valign='R');
                }else{
                    $pdf->Cell($width_cell[4],"_",$valign='R');
                }
            }

        $pdf->setX(238);
    
        $pdf->Cell($width_cell[4],$row['m'],$average,$exam_out_of,$valign='R');

        $SubjectPercentages = round($SubjectPercentage);

            if($SubjectPercentages >= 96){
                $grade = "EX";
            }elseif ($SubjectPercentages >= 86 && $SubjectPercentages <= 95) {
                $grade = "VG";
            }elseif($SubjectPercentages >=70 && $SubjectPercentages <= 85 ){
                $grade = "G";
            }elseif ($SubjectPercentages >= 50 && $SubjectPercentages <= 69) {
                $grade = "P";
            }else {
                $grade = "F";
            }

        $pdf->Cell($width_cell[10],$grade,$ln=1,$valign='R');

        $fill = !$fill; $cnt = $cnt + 1;
    }

这是当前结果

enter image description here

我从表中预期的结果应该是分配给(9)穆罕德·阿里·阿巴巴卡(表上的数字25)的标记应在标记273的正上方第8列中,但应放置在第一个单元格上。最右边是获得的标记总数。

解决方法

我不认为我们一帆风顺,但我已经尝试过这种方式(因为我没有tcpdf,所以我没有触摸它):

$results_ = [
    ['mar' => '210 => 20,223 => 9','subjects_' => '210,221,222,223','m' => 29],['mar' => '210 => 30,223 => 12','m' => 42],];

foreach ($results_ as $row) {
    $subjects_ = $row['subjects_'];
    $subjectIDs = explode(',',$subjects_);
    asort($subjectIDs);

    // prepare final marks by subject id for key and zero 0 value attributed by default.
    $marks = \array_fill_keys($subjectIDs,0);
    // ---------------------------------------------------------------------

    $smarks = $row['mar'];
    // fill $marks keys subject by real mark attribute
    $marksBySubject = \array_map(
        function(string $elem) use (&$marks) {
            $details = \explode(' => ',$elem);
            $marks[\trim($details[0])] = (float) \trim($details[1]);
        },explode(',$smarks)
    );

//    print_r($marks);
//    Array
//    (
//        [210] => 30
//        [221] => 0
//        [222] => 0
//        [223] => 12
//    )

    // now marks contains all marks for all subjects,if a mark is missing it will be zero attributed.
}

我们准备将$marks设为一个数组,其键将是使用者id和值(默认情况下为零),因此我们可以处理pdf输出中的偏移量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。