PHP问题迭代数组

时间:2015-09-15 16:12:23

标签: php arrays loops

我有两个阵列$ patient和$ escorts。

这些阵列代表了各种患者和护送人员的住院时间。 伴游有一个[' Escort'] [' id']值与访客(患者)的ID相关联。

我的目标是两个接受患者和护送阵列,并将它们组合成一个可用于打印的结果数组(表格或创建excel文件)。

患者可能有多次停留,患者也可能有多个护送护送他们。

$patients = [
     Patient A,
     Patient B,
     Patient B
     Patient C,
     Patient D,
     Patient E
 ];

 $escorts = [
     Escort for Patient B,
     Escort 1 for Patient C,
     Escort 2 for Patient C,
     Escort for Patient E 
 ];

我试图按以下顺序获取$ newResults数组:

$newResults = [
   Patient A,
   Patient B,
   Patient B,
   Escort for Patient B,
   Patient C,
   Escort for Patient C,
   Escort for Patient C,
   Patient D,
   Patient E,
   Escort for Patient E,
]

然而,当我完成对两个阵列的迭代时,我有剩余的$ escort元素,这些元素在他们的$ patient对应物之后没有被添加,但是通过患者的数据[&# 39;嘉宾'] [' id']和护送人员[' Escort'] [' id']匹配,所以我&#39 ;我不确定他们为什么不被包括在内。

我使用的代码是:

 $lastPatientID = 0;
 foreach($patients as $pkey => $patient) {
    if($lastPatientID == 0) {
        $lastPatientID = $patient['Guests']['id'];
    }

    if($patient['Guests']['id'] == $lastPatientID) {
        // Add Patients Next Accommodation
        $newResults[] = $patient;
    } else {
        $theseEscorts = [];

        foreach($escorts as $ekey => $escort) {
            if($escort['Escort']['id'] == $lastPatientID) {
                $theseEscorts[] = $escort;
                unset($escorts[$ekey]);
            }
        }

        // Print the escorts for the Last Patient.
        foreach($theseEscorts as $anEscort) {
            $newResults[] = $anEscort;
        }

        // This Patient is different than last. Print New Patient.
        $newResults[] = $patient;
    }

    $lastPatientID = $patient['Guests']['id'];
}

// Clear any remaining escorts that match the last patient.
foreach($escorts as $escort) {
     if($escort['Escort']['id'] == $lastPatientID) {
         $newResults[] = $escort;
     } else {
          // NOTE:: THIS SHOULDN'T HAPPEN UNLESS DATA IS BAD!
          error_log("Orphaned Escort: \n" . print_r($escort, TRUE) );
     }
 }

我必须犯这个逻辑错误,虽然我不确定在哪里。

任何建议都非常适合!

2 个答案:

答案 0 :(得分:1)

很难说你在这里给出了什么。我们在IRC上对此进行了讨论,并根据数组的实际结构提出了这个解决方案。

特点:

  • 结果数组中的每一行都是该患者的一名患者或一名护送人员
  • 该类型将告诉您它是哪个
  • rec将为您提供所有其他信息
  • 构建escortMap可确保您不必为每位患者循环所有护送。

   $('button').click(function() {
      $('.CRAZY').hide();
      $('.CRAZY2').show();
    });

答案 1 :(得分:0)

我找到了解决方法。问题的原因是一些不良数据,即护送与患者相关联的情况,该患者在数据库表中没有住宿条目。

我的解决方案是实现一个uasort()函数,以正确的顺序放置我想要的行:

uasort($newResults, function($a, $b) {
    $aSortOn = ($a['Accommodations']['purpose_id'] != 4 ? $a['Guests']['lastName'] : $a['Escort']['lastName']);
    $bSortOn = ($b['Accommodations']['purpose_id'] != 4 ? $b['Guests']['lastName'] : $b['Escort']['lastName']);

    if($aSortOn == $bSortOn) {
        $aSortOn = ($a['Accommodations']['purpose_id'] != 4 ? $a['Guests']['firstName'] : $a['Escort']['firstName']);
        $bSortOn = ($b['Accommodations']['purpose_id'] != 4 ? $b['Guests']['firstName'] : $b['Escort']['firstName']);
    }

    if($aSortOn == $bSortOn) {
        // Sort to Make Sure Patient (Purpose_id != 4) is above (Purpose_id == 4) in results.
        if($a['Accommodations']['purpose_id'] != 4 && $b['Accommodations']['purpose_id'] == 4) {
            return 0;
        } else {
            return 1;
        }

    } else {
        return ($aSortOn < $bSortOn) ? -1 : 1;
    }
});

如果访客是患者,它将按LastName,FirstName对它们进行排序,如果它们是护送,则按护送人员的LastName,FirstName对它们进行排序。