It is important to check if the field is empty. In this case field_get_items() returns false (which sucks). $items = field_get_items('node', $node, 'field_countries', $node->language); if (!empty($items)) { $item = reset($items); return $item['value']; } else { return NULL; } I think you can generally be sure that if an item exists, it will be in the zero [0] index. And isset() is a very robust thing. So the following works as well: $items = field_get_items('node', $node, 'field_countries', $node->language); return isset($items[0]['value']) ? $items[0]['value'] : NULL; For some field types, the value is not in $item['value'] but in $item['tid'] or something else. In the usual case (I can't think of an exception atm), the value will be the first thing in the $item array. So the following will also work, but this is more by coincidence than by design. So personally I would not count on it. (If $items is a (non-empty) array, then we can safely (*) assume that every $item will be an array too, and not something else.) $items = field_get_items('node', $node, 'field_countries', $node->language); return isset($items[0]) ? reset($items[0]) : NULL; The return value of field_get_items() is by-value, so it is generally ok to modify the $items array. This means you can use array_shift(). $items = field_get_items('node', $node, 'field_countries', $node->language); return !empty($items) ? array_shift(array_shift($items)) : NULL; (*) Most of the assumptions we make here are not based on language-level guarantees, but just on how Drupal generally works.