PHP:嵌套的Foreach循环问题

时间:2010-01-12 15:44:14

标签: php

我正在尝试根据月份值显示用户列表。我想显示1月然后与之关联的所有用户等...

我现在拥有的是前几个月正常工作,之后什么也没做。我在代码中有注释,此代码的实时版本正在运行:http://blog.funeraldirectorslife.com/participants/

<?php
/*
Template Name: Participants
*/
?>
<?php
    function display_user($author, $month){
        $ID = $author->ID;
        $full_name = get_the_author_meta('display_name', $ID);
        $usr_name = get_the_author_meta('user_nicename', $ID);
        $sab_descriptiom = get_cimyFieldValue("$ID", 'Sabbatical_desc');
        $sab_start = get_cimyFieldValue("$ID", 'Sabbatical_Start');
        $sab_end = get_cimyFieldValue("$ID", 'Sabbatical_End');
        $sab_month = get_cimyFieldValue("$ID", 'Sabbatical_Month');
        $author_posts = $author->num_posts;
        //$months = array(January, February, March, April, May, June, July, August, September, October, November, December);
        //echo $sab_month;

        if ($sab_month == $month){
            echo "<li>";                                    
            echo "<h4 class=\"nomar\"><a href=\"http://blog.funeraldirectorslife.com/author/" 
                    . $usr_name                                  
                    ."\">"
                    .$full_name 
                    ."(" 
                    . $author_posts
                    . ")" 
                    . "</a>" 
                    . "</h4>";
            echo    $sab_start 
                    . " - " 
                    . $sab_end 
                    . "<br />";
            echo    $sab_descriptiom 
                    . "<br />"
                    . $sab_month . "</br>" . "</li>" . "\n";
        }
        else {
            return;
        }
    }

?>
<?php get_header(); ?>
<div id="bd" class="grid_12 alpha omega clearfix">
    <?php get_sidebar(); ?>
    <div id="main" class="grid_9 omega">
        <?php include(TEMPLATEPATH . '/banner.php'); ?>

        <div class="unit">
            <!--
            <div class="head">
                <div class="title"><h3><span>Blog Entries</span></h3></div>
            </div>
            //-->
            <div class="body clearfix">
                <ul class="styled_list">

                    <li class ="alpha"><h3 class="nomar"><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?></span></a></h3></li>


                    <?php                       
                    //grab authors ids, post count, and extended info from database
                    //fill $authors array with data
                    $sql = "SELECT * FROM `wp_users` WHERE 1 ORDER BY ID";  
                    $results = $wpdb->get_results($sql);
                    $authors = $results;

                    $author_count = array();
                    $rows = $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author");
                    foreach ($rows as $row) {
                        $author_count[$row->post_author] = $row->count;
                    }
                    //combine queries
                    foreach( $authors as $author ) {
                        $author->num_posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0;
                    }

                    //month array for comparing with sabbatical month 
                    $months = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December');


                    //tried old method for iterating arrays --> same result
                    /*reset($months);
                    while (list($key, $month) = each($months)){
                        echo "<h2 class=\"nomar\">" .  $month . "</h2>" . "\n";

                        foreach($authors as $author) {
                            display_user($author, $month);  
                            //echo $author->ID;
                        }
                    }*/



                    foreach($months as $month ) {
                        echo "<h2 class=\"nomar\">" .  $month . "</h2>" . "\n";

                        foreach($authors as $author) {
                            display_user($author, $month);  
                            //echo $author->ID;
                        }


                        //lists authors by ID - just making sure array is intact after each author loop
                        /*foreach($authors as $author) {
                            $ID = $author->ID;
                            $foo = get_cimyFieldValue("$ID", 'Sabbatical_Month');
                            echo $ID . $foo . "<br /> . "\n"";                  
                        }*/
                    }
                    ?>
                </ul>
            </div>      
        </div>
    </div>
</div>
<?php get_footer(); 

?>

2 个答案:

答案 0 :(得分:1)

我不确定它是否能正常工作,但我已经稍微更新了你的代码。主要是我在比较trim()$sab_month时添加了$month功能,但我还清理了一些代码。您可以在PHP中将变量嵌入双引号字符串中,因此您不必将它们连接起来: - )

<?php /* Template Name: Participants */ ?>

<?php
    function display_user($author, $month){
        $ID = $author->ID;
        $full_name = get_the_author_meta('display_name', $ID);
        $usr_name = get_the_author_meta('user_nicename', $ID);
        $sab_descriptiom = get_cimyFieldValue("$ID", 'Sabbatical_desc');
        $sab_start = get_cimyFieldValue("$ID", 'Sabbatical_Start');
        $sab_end = get_cimyFieldValue("$ID", 'Sabbatical_End');
        $sab_month = get_cimyFieldValue("$ID", 'Sabbatical_Month');
        $author_posts = $author->num_posts;
        //$months = array(January, February, March, April, May, June, July, August, September, October, November, December);
        //echo $sab_month;

        if (trim($sab_month) == trim($month)){
            echo "<li>";                                    
            echo "  <h4 class='nomar'><a href='http://blog.funeraldirectorslife.com/author/$usr_name'>$full_name($author_posts)</a></h4>";
            echo "  $sab_start - $sab_end<br />";
            echo "  $sab_descriptiom<br />";
            echo "  $sab_month</br>";
                echo "</li>\n";
        }
            /* Not necessary. The function will return when it hits the end
        else {
            return;
        }
            */
    }

?>
<?php get_header(); ?>
<div id="bd" class="grid_12 alpha omega clearfix">
    <?php get_sidebar(); ?>
    <div id="main" class="grid_9 omega">
        <?php include(TEMPLATEPATH . '/banner.php'); ?>

        <div class="unit">
            <!--
            <div class="head">
                <div class="title"><h3><span>Blog Entries</span></h3></div>
            </div>
            //-->
            <div class="body clearfix">
                <ul class="styled_list">

                    <li class ="alpha"><h3 class="nomar"><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?></span></a></h3></li>


                    <?php                       
                    //grab authors ids, post count, and extended info from database
                    //fill $authors array with data
                    $sql = "SELECT * FROM `wp_users` WHERE 1 ORDER BY ID";  
                    $results = $wpdb->get_results($sql);
                    $authors = $results;

                    $author_count = array();
                    $rows = $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author");
                    foreach ($rows as $row) {
                        $author_count[$row->post_author] = $row->count;
                    }
                    //combine queries
                    foreach( $authors as $author ) {
                        $author->num_posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0;
                    }

                    //month array for comparing with sabbatical month 
                    $months = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December');


                    //tried old method for iterating arrays --> same result
                    /*reset($months);
                    while (list($key, $month) = each($months)){
                        echo "<h2 class=\"nomar\">" .  $month . "</h2>" . "\n";

                        foreach($authors as $author) {
                            display_user($author, $month);  
                            //echo $author->ID;
                        }
                    }*/



                    foreach($months as $month) {
                        echo "<h2 class='nomar'>$month</h2>\n";

                        foreach($authors as $author) {
                            display_user($author, $month);  
                            //echo $author->ID;
                        }

                        //lists authors by ID - just making sure array is intact after each author loop
                        /*foreach($authors as $author) {
                            $ID = $author->ID;
                            $foo = get_cimyFieldValue("$ID", 'Sabbatical_Month');
                            echo $ID . $foo . "<br /> . "\n"";                  
                        }*/
                    }
                    ?>
                </ul>
            </div>      
        </div>
    </div>
</div>
<?php get_footer(); ?>

答案 1 :(得分:0)

显然,如果在第一个月if ($sab_month == $month)之后失败 也许一些错字,案件差异也许?我尝试添加

echo "Sab month == ",$sab_month,"\n script month ==",$month;
把它放在if之前。祝你好运


我知道我使用了逗号,这只是使用echo的另一种方式。