在下面的代码中,第一次正确提取数据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);
?>
最合适的回答,由SO网友:Pieter Goosen 整理而成
正如mrwweb和我引用他的话所指出的
。。。但我看不出你有什么理由setup_postdata() 和wp_reset_postdata()
您没有试图在此处设置新帖子,只是从已设置的帖子中检索现有数据
问题的主要原因是变量的使用$post 在你所有的foreach 循环。这将在foreach 上一个循环之后的循环作为$post 在foreach 循环,从而得到意外的输出。下面是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);
}
?>