[#4296] Fix issue with ObjectProperty filters

- array_walk() will traverse every pointer in the original input,
  regardless of modifications to the input, leading to errors. Modified
  ObjectProperty hydrator to filter keys first, and then extract values.
Less expensive operation

- array_keys() essentially creates a new array, using more memory. It's also
  like iterating the array twice.
- If we're going to iterate once, might as well only do it once.
Merge branch 'weierophinney-hotfix/4296'
Close #4296