3

这是我正在尝试做的似乎不起作用的基本逻辑。

  1. 遍历字母表数组
  2. 对于每个字母,循环通过 XML,如果程序名称以当前字母开头,并且主要不在输出数组中,则输出带有 XML 中一些数据的链接
  3. 每当链接输出时,将主要添加到输出数组中,这样我们就不会输出双精度数

问题是,即使主要是在数组中的行:

if (!in_array($program->Program, $majors)) {

总是返回真,导致双打被输出。

目前在页面上,在它输出的每个链接之后,我还输出整个数组以直观地确认主要存在于数组中,当您到达主要 WBAN 的页面底部时,您可以在第一个输出中查看在它上面的数组中,看到它在数组中不存在,所以它输出但是,下一个链接输出也是 WBAN,你可以在上面的数组中看到它已经存在,所以 if 应该返回 false 和不输出...

我的逻辑一定是有缺陷的地方——我试过移动 array_push 并且不能让它正常工作——我需要新鲜的眼睛。

另外 - 如果我错了,请纠正我,但我不能从 XML 中清除重复的原因是因为完整的 XML 节点不是重复的 - 只是主要的。

例如,这里是 XML - 只有 Program 和 MajorDescription 会被复制,所以完整的 XML 节点不会被认为是重复的?:

<ProgramList>
    <MajorDescription>WEB ANIMATION AND DESIGN</MajorDescription>
    <Program>WBAN</Program>
    <ProgramLocations>
        <ProgramLocation>
            <Campus>Barrie</Campus>
        </ProgramLocation>
    </ProgramLocations>
    <Term>201310</Term>
</ProgramList>

完整代码:

<?php 
$majors = array();
foreach ($alphabet as $l){
    $upper = strtoupper($l);                            

    foreach ($listxml->ProgramList as $program) {
        $letter = substr($program->MajorDescription, 0, 1);
        if (strcasecmp($letter, $l) == 0) {
            $count1++;
            $noprograms = false;
        }                               
    }

    if ($count1 == 0) {
        echo "<div id='$l' class='letter noprograms'>"; 
    } else {
        echo "<div id='$l' class='letter'>";
    }                           

    echo "<h2>$upper</h2>";

    foreach ($listxml->ProgramList as $program) {                             
        $letter = substr($program->MajorDescription, 0, 1);                

        if (strcasecmp($letter, $l) == 0) { 

            foreach ($majors as $major){
                echo "<p>".$major."</p>";
            }                  
            //this is where the problem is - this is always coming back true even if the major is in the array 
            if (!in_array($program->Program, $majors)) {                                    
                echo "<a href='../program/?major=".$program->Program."' class='programLink'>".$program->Program." - ".strtoupper($program->MajorDescription)."</a> - <a target='_BLANK' href='http://www.ontariocolleges.ca/SearchResults/GEORGIAN/_/N-1z1419r?Ntt=".rawurlencode($program->MajorDescription)."&Ns1=Program_Title_SORT&Ns2=0&Qo=20&SearchWithin=on'>Apply Now</a><br />";                                                                                                           
                array_push($majors, $program->Program);
            }                                                                       
            $count++;                                   
        }                               
    }
    if ($count == 0) {
        echo "<em class='noprograms'>No Programs</em><br />";
    }
    echo "</div>";                      
    $count = 0;
    $count1 = 0;
}

if ($noprograms) {
    echo '<div id="noprograms"><em>No results. Try broadening the search filters.</em></div>';
}
?>
4

3 回答 3

2

您必须将节点转换为字符串值:

if (!in_array((string)$program->Program, $majors)) {

和:

array_push($majors, (string)$program->Program);

这是您在使用 SimpleXML 时必须习惯的事情之一;将变量隐式转换为字符串的函数不需要这种特殊处理,但是如果您真的很偏执,我建议您将所有内容都转换为 ;-)

例如,substr()不需要强制转换,因为它希望第一个参数无论如何都是一个字符串,它会自动强制转换它。

于 2012-09-28T15:03:12.627 回答
1

if (!in_array($program->Program, $majors, true)) {
                                          ^^^^

in_array有一个严格的参数,你应该在处理对象时使用它(就像你一样)。

另一种选择是SplObjectStorage.

$majors = new SplObjectStorage;

$majors->containts($program->Program);

$majors->attach($program->Program);

最后是关键变体:

$programName = (string) $program->Program;

isset($majors[$programName]);

$majors[$programName] = 1;
于 2012-09-28T15:14:13.370 回答
0

不确定,但我认为您在这部分可能有问题:

foreach ($listxml->ProgramList as $program) {                             
    $letter = substr($program->MajorDescription, 0, 1);                

    if (strcasecmp($letter, $l) == 0) { 

        foreach ($majors as $major){
            echo "<p>".$major."</p>";
        }                  
        //this is where the problem is - this is always coming back true even if the major is in the array 
        if (!in_array($program->Program, $majors)) {                                    
            echo "<a href='../program/?major=".$program->Program."' class='programLink'>".$program->Program." - ".strtoupper($program->MajorDescription)."</a> - <a target='_BLANK' href='http://www.ontariocolleges.ca/SearchResults/GEORGIAN/_/N-1z1419r?Ntt=".rawurlencode($program->MajorDescription)."&Ns1=Program_Title_SORT&Ns2=0&Qo=20&SearchWithin=on'>Apply Now</a><br />";                                                                                                           
            array_push($majors, $program->Program);
        }                                                                       
        $count++;                                   
    }                               
}

对于中的每个元素,$listxml->ProgramList您将打印所有$majors.

你应该尝试把

        foreach ($majors as $major){
            echo "<p>".$major."</p>";
        }

循环之后的foreach ($listxml->ProgramList as $program) {循环。

你也做了两次同样的测试:

foreach ($listxml->ProgramList as $program) {                             
    $letter = substr($program->MajorDescription, 0, 1);                

    if (strcasecmp($letter, $l) == 0) { 

也许您可以通过将两个块放在一起来优化您的脚本?

于 2012-09-28T15:07:35.967 回答