protected static function getValue($item, $index, $ignore = false, &$err = null)
    {
        $err = null;
        
        if (empty($index)) return $item;
        
        $key = array_shift($index);
        
        if ((is_array($item) || $item instanceof \Traversable) && isset($item[$key])) {
            return static::getValue($item[$key], $index, $ignore, $err);
        }
        
        if (is_object($item) && isset($item->$key)) {
            return static::getValue($item->$key, $index, $ignore, $err);
        }
        
        if ((!is_object($item) && !is_array($item)) || !$ignore) {
            $err = (object)['var' => isset($item) ? gettype($item) : null, 'incomplete' => count($index) + 1];
        }
        
        return null;
    }
protected static function getValue($item, $index, $ignore = false, &$err = null)
    {
        $err = null;
        
        if (empty($index)) return $item;
        
        $key = array_shift($index);
        
        if ((is_array($item) || $item instanceof \Traversable) && isset($item[$key])) {
            return static::getValue($item[$key], $index, $ignore, $err);
        }
        
        if (is_object($item) && isset($item->$key)) {
            return static::getValue($item->$key, $index, $ignore, $err);
        }
        
        if ((!is_object($item) && !is_array($item)) || !$ignore) {
            $err = (object)['var' => isset($item) ? gettype($item) : null, 'incomplete' => count($index) + 1];
        }
        
        return null;
    }
protected static function getValue ( $ item , $ index , $ ignore = false , & $ err = null ) { $ err = null ; if ( empty ( $ index ) ) return $ item ; $ key = array_shift ( $ index ) ; if ( ( is_array ( $ item ) || $ item instanceof \ Traversable ) && isset ( $ item [ $ key ] ) ) { return static :: getValue ( $ item [ $ key ] , $ index , $ ignore , $ err ) ; } if ( is_object ( $ item ) && isset ( $ item -> $ key ) ) { return static :: getValue ( $ item -> $ key , $ index , $ ignore , $ err ) ; } if ( ( ! is_object ( $ item ) && ! is_array ( $ item ) ) || ! $ ignore ) { $ err = ( object ) [ 'var' => isset ( $ item ) ? gettype ( $ item ) : null , 'incomplete' => count ( $ index ) + 1 ] ; } return null ; }
Navigate through the item and get the value

@param array  $item
@param array  $index   The index sequence we are navigating to
@param array  $ignore  Don't raise an error if not exists
@param object $err     Error object [OUTPUT]
@return mixed
Navigate through the item and get the value