在下面的代码中,第一次正确提取数据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);
}
?>