循环中的第二个Foreach返回bool(FALSE),尽管数组存在

时间:2014-08-31 作者:user3449454

在下面的代码中,第一次正确提取数据foreach, 但第二次没有返回任何内容foreach 虽然选择了一个,但在第二个foreach. 我还是会出错

警告:为第行的foreach()提供的参数无效foreach ($authorlist as $post)...

然而,第二个foreach 删除第一个后立即正确返回数据foreach

下面是我的代码

<?php

$all= get_posts(array(\'post_type\' => \'books\', \'numberposts\' => -1,));

foreach ( $all as $post ) :  setup_postdata($post);

    if (!empty($post))
    {
     $booklink = array();

     $booklist = get_field(\'booklist\'); 
               foreach ($booklist as $post) : setup_postdata($post);
                    if (!empty($post))
                        {
                        $booklink[] = strip_tags(get_field(\'booklink\',$post));                                       
                        }
                endforeach;
                wp_reset_postdata();
     echo $booklink[0];  

     $authorname = array();

     $authorlist = get_field(\'authorlist\'); 
               foreach ($authorlist as $post) : setup_postdata($post);
                    if (!empty($post))
                        {
                        $authorname[] = strip_tags(get_field(\'authorname\',$post));                                       
                        }
                endforeach;
                wp_reset_postdata();
echo $authorname[0]; 

    }
endforeach;
?>
是的var_dump($authorlist) 它回来了bool(false) 只要foreach ($booklist as $post) 存在循环。当我删除该循环时,转储将显示authorlist 正确地如何使两个循环一起工作?

您可以看到输出here

为每个仍不工作的foreach添加了unset和change$post

<?php

$all= get_posts(array(\'post_type\' => \'books\', \'numberposts\' => -1,));
echo "VAR_DUMP(all) <br>";
var_dump($all);
echo "<br>";
echo "<br>";
foreach ( $all as $post ): setup_postdata($post);

    if (!empty($post))
    {
     $booklink = array();

     $booklist = get_field(\'booklist\'); 
               foreach ($booklist as $bookpost): setup_postdata($bookpost);
                    if (!empty($bookpost))
                        {
                        $booklink[] = strip_tags(get_field(\'booklink\',$bookpost));                                       
                        }

        endforeach;
        wp_reset_postdata();
        unset($bookpost);


    echo "<br>";
    echo "var dump for booklist";
    echo "<br>";
    var_dump( $booklist);
    echo "<br>";
    echo "<br>";
     echo "booklink is - " . $booklink[0]."<br>";  

     $authorname = array();

     $authorlist = get_field(\'authorlist\'); 
               foreach ($authorlist as $authorpost): setup_postdata($authorpost);

                    if (!empty($authorpost))
                        {
                        $authorname[] = strip_tags(get_field(\'authorname\',$authorpost));                                       
                        }

                endforeach;
        wp_reset_postdata();        
                unset($authorpost);

    echo "<br>";
    echo "var dump for authorlist";
   echo "<br>";
    var_dump( $authorlist);
    echo "<br>";
   echo "<br>"; 
     echo "authorname is - ".$authorname[0]."<br>"; 

    }

endforeach;
wp_reset_postdata();
unset($post);
?>

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

正如mrwweb和我引用他的话所指出的

。。。但我看不出你有什么理由setup_postdata()wp_reset_postdata()

您没有试图在此处设置新帖子,只是从已设置的帖子中检索现有数据

问题的主要原因是变量的使用$post 在你所有的foreach 循环。这将在foreach 上一个循环之后的循环作为$postforeach 循环,从而得到意外的输出。下面是php manual 不得不说

Warning

a的引用$value 最后一个数组元素即使在foreach 环建议通过以下方式销毁unset().

因此,作为可能的解决方案,您可以重命名$post 变量在每个foreach 回路,或根据建议,unset($post) 每次之后foreach.

请注意,不要使用:endforeach, 而是使用花括号({}). 花括号使代码更易于调试和阅读,所有代码编辑器都支持花括号,而方法不支持花括号

EDIT

如前所述,您应该删除wp_reset_postdata()setup_postdata() 你们两个foreach 主回路内的回路foreach 环我还完全重新排列了您的代码。你必须检查你的array_expression 不为空before 这个foreach 把整个包裹起来foreach 在该条件语句中循环。

检查是否$value 内部为空foreach 回路,itwill 只要你的内心有东西,就要有价值array_expression. 如果您的array_expression 为空,则无论是否检查Svalue 不为空

警告:为foreach()提供的参数无效

您的代码应该是这样的(请注意:这是未经测试的)

<?php

$all= get_posts(array(\'post_type\' => \'books\', \'numberposts\' => -1,));
echo "VAR_DUMP(all) <br>";
var_dump($all);
echo "<br>";
echo "<br>";


if( !empty( $all ) ) {

foreach ( $all as $post ){

    setup_postdata($post);

     $booklink = array();

     $booklist = get_field(\'booklist\'); 

          if( !empty($booklist) ) {
               foreach ($booklist as $bookpost) { 
                    

                  $booklink[] = strip_tags(get_field(\'booklink\',$bookpost)); 
                                  
 
               }

             unset($bookpost);
          }


    echo "<br>";
    echo "var dump for booklist";
    echo "<br>";
    var_dump( $booklist);
    echo "<br>";
    echo "<br>";
     echo "booklink is - " . $booklink[0]."<br>";  

     $authorname = array();

     $authorlist = get_field(\'authorlist\'); 

           if (!empty($authorlist)) {

               foreach ($authorlist as $authorpost) {


                        $authorname[] = strip_tags(get_field(\'authorname\',$authorpost));                                       

                }
               
                unset($authorpost);

            }


    echo "<br>";
    echo "var dump for authorlist";
   echo "<br>";
    var_dump( $authorlist);
    echo "<br>";
   echo "<br>"; 
     echo "authorname is - ".$authorname[0]."<br>"; 


}
wp_reset_postdata();
unset($post);
}
?>

结束

相关推荐

使用uninstall.php删除共享选项

我正在使用uninstall.php 让我的插件在卸载(删除)时删除我的插件对站点所做的所有跟踪。我做得很好,但即使在删除之后options 表格:uninstall_pluginsrecently_activated_site_transient_update_plugins在这些选项中,还有来自其他插件的多个值。我该如何处理这些痕迹,我该如何去除所有这些痕迹?我检查了WooCommerce,发现如果选中了“删除数据”复选框,则删除后不会留下任何痕迹。我该怎么做?