php foreach 中的上下文是如何工作的?

How context works inside php foreach?

我正在编写一个简单的选项卡导航,但我遇到了这个问题:

函数 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;
}

当在 中调用 foreach 时,我得到:

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

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

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

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

示例关联数组

如果您的数组如下所示:

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

您无法通过 $loop->posts[0] 访问 "Post message 1"。但是你可以通过 $loop->posts['key1']

可移动/ArrayAccess

Traversable and ArrayAccess on php.net有很好的解释

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