DataMutatorTrait.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <?php
  2. namespace Grav\Common\Data;
  3. trait DataMutatorTrait
  4. {
  5. /**
  6. * Get value by using dot notation for nested arrays/objects.
  7. *
  8. * @example $value = $data->get('this.is.my.nested.variable');
  9. *
  10. * @param string $name Dot separated path to the requested value.
  11. * @param mixed $default Default value (or null).
  12. * @param string $separator Separator, defaults to '.'
  13. * @return mixed Value.
  14. */
  15. public function get($name, $default = null, $separator = '.')
  16. {
  17. $path = explode($separator, $name);
  18. $current = $this->items;
  19. foreach ($path as $field) {
  20. if (is_object($current) && isset($current->{$field})) {
  21. $current = $current->{$field};
  22. } elseif (is_array($current) && isset($current[$field])) {
  23. $current = $current[$field];
  24. } else {
  25. return $default;
  26. }
  27. }
  28. return $current;
  29. }
  30. /**
  31. * Set value by using dot notation for nested arrays/objects.
  32. *
  33. * @example $value = $data->set('this.is.my.nested.variable', true);
  34. *
  35. * @param string $name Dot separated path to the requested value.
  36. * @param mixed $value New value.
  37. * @param string $separator Separator, defaults to '.'
  38. */
  39. public function set($name, $value, $separator = '.')
  40. {
  41. $path = explode($separator, $name);
  42. $current = &$this->items;
  43. foreach ($path as $field) {
  44. if (is_object($current)) {
  45. // Handle objects.
  46. if (!isset($current->{$field})) {
  47. $current->{$field} = array();
  48. }
  49. $current = &$current->{$field};
  50. } else {
  51. // Handle arrays and scalars.
  52. if (!is_array($current)) {
  53. $current = array($field => array());
  54. } elseif (!isset($current[$field])) {
  55. $current[$field] = array();
  56. }
  57. $current = &$current[$field];
  58. }
  59. }
  60. $current = $value;
  61. }
  62. }