ArrayNode::getKeys, getValues, and hasKey

The two getters return NodeCollections of the keys and values of an array, respectively. Each accepts a single boolean argument indicating whether or not to recurse into sub-arrays.

hasKey() is a bit confusing; it can accept either a scalar value (not a ScalarNode) or an ExpressionNode. If it's given a scalar, it'll first filter the array keys to the ones which implement ScalarNode, then strict-compare the value of each with the search key.

On the other hand, if hasKey() gets an ExpressionNode, it will strict-compare the getText() version of each key with the getText() version of the search key.

hasKey() accepts a $recursive boolean as well, which it passes to getKeys().

Thar of course be tests for all of this jiggery-pokery.