field_get_items()
通常推奨されるソリューションです。ただし、いくつかの注意点があります。
フィールドが空かどうかを確認することが重要です。この場合、field_get_items()はfalseを返します(これは悪いことです)。
$items = field_get_items('node', $node, 'field_countries', $node->language);
if (!empty($items)) {
$item = reset($items);
return $item['value'];
}
else {
return NULL;
}
一般的に、アイテムが存在する場合、そのアイテムはゼロ[0]インデックスにあると確信できます。isset()は非常に堅牢です。したがって、以下も機能します:
$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]['value']) ? $items[0]['value'] : NULL;
一部のフィールドタイプでは、値は$ item ['value']ではなく、$ item ['tid']または何か他のものにあります。
通常の場合(例外atmは考えられません)、値は$ item配列の最初のものになります。したがって、以下も機能しますが、これは偶然によるものであり、設計によるものではありません。だから個人的にはそれを当てにしません。
($ itemsが(空ではない)配列の場合、すべての$ itemも配列であり、他のものではないことを安全に(*)想定できます。)
$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]) ? reset($items[0]) : NULL;
field_get_items()の戻り値は値によるので、通常は$ items配列を変更しても問題ありません。つまり、array_shift()を使用できます。
$items = field_get_items('node', $node, 'field_countries', $node->language);
return !empty($items) ? array_shift(array_shift($items)) : NULL;
(*)ここで行うほとんどの仮定は、言語レベルの保証に基づくものではなく、Drupalの一般的な動作方法に基づいています。
ところで、次のトリックは役立つ場合がありますが、元の質問の完全な解決策ではありません。
$items = field_get_items(..) ?: array();
これは、$ itemsが常に配列であることを保証します。しかし、上記のスニペットの場合、これは実際には役立ちません。