【问题标题】:How context works inside php foreach?上下文如何在 php foreach 中工作?
【发布时间】:2016-12-04 08:59:35
【问题描述】:

我正在写一个简单的标签导航,我正面临这个问题:

print_office 函数仅在我在 foreach 中时才有效。

//Doesn't work
print_office($loop->posts[0], true);

//Works
foreach ($loop->posts as $index => $post) {
    print_office($post, true);
}

print_office 函数利用高级自定义字段的get_field('field_name')

编辑:

我在print_office 中添加了一个var_dump($office)

当在foreach 外部调用时,我得到:

object(WP_Post)#317 (24) {
  ["ID"]=> int(7)
  ["post_author"]=> string(1) "1"

  [.....] //More fields;
}

当调用 inside foreach我得到:

FOREACH:object(WP_Post)#317 (24) {
  ["ID"]=> int(7)
  ["post_author"]=> string(1) "1"

  [.....] //More fields;
}

所以唯一的区别是:FOREACH:object 而不是 object

【问题讨论】:

  • php 默认是传值。两者之间应该没有操作差异。基本调试:var_dump($loop->posts) 看看你在处理什么。也许你没有索引0
  • $loop->postsArray 还是ArrayIterator 还是什么?
  • 请出示周边代码。 Wordpress 依赖于一堆全局变量(主要是因为它的年龄和向后兼容性,但无论如何..),所以我可以想到一些原因,但需要更多信息。
  • var_dump($office) 打印像 FOREACH:object 这样的东西 周围有 runkit 的东西吗?
  • foreach 构造永远不会操纵函数内的流程!但是foreach 会创建您的数组的副本并使用它。所以像foreach(functionX() as $result){} 这样的cunstructs 可以在PHP 中工作。但该函数只被调用一次,而不是在每个循环中。

标签: php wordpress foreach advanced-custom-fields


【解决方案1】:

问题只是,当它不起作用时,没有$post变量,而get_field('field_name')返回的是当前post的字段,实际上是$post

【讨论】:

  • 就是这样。我在foreach 中覆盖了$post,这就是为什么它在内部工作而不是在外部工作。
【解决方案2】:

看起来$loop->posts 是一个关联数组(类似于 JS 对象),或者 $loop->posts 扩展了 Traversable 接口但不是 ArrayAccess 接口。

示例关联数组

如果你的数组是这样的:

<?php
     $loop->posts = array(
         'key1' => 'Post message 1',
         'key2' => 'Post message 2'
     );
?>

您无法通过 $loop-&gt;posts[0] 访问“发布消息 1”。但是你可以通过$loop-&gt;posts['key1']

Travesable / ArrayAccess

php.net上的TraversableArrayAccess有很好的解释

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多