deep.func.php 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <?php
  2. namespace zin\utils;
  3. /**
  4. * @param object|mixed[] $data
  5. * @param mixed $defaultValue
  6. * @return mixed
  7. */
  8. function deepGet(&$data, $namePath, $defaultValue = null)
  9. {
  10. $names = explode('.', $namePath);
  11. foreach($names as $name)
  12. {
  13. if(is_object($data))
  14. {
  15. if(!isset($data->$name)) return $defaultValue;
  16. $data = &$data->$name;
  17. continue;
  18. }
  19. if(!is_array($data) || !isset($data[$name])) return $defaultValue;
  20. $data = &$data[$name];
  21. }
  22. return $data === null ? $defaultValue : $data;
  23. }
  24. /**
  25. * @param mixed[]|object $data
  26. * @param mixed $value
  27. */
  28. function deepSet(&$data, $namePath, $value)
  29. {
  30. $names = explode('.', $namePath);
  31. $lastName = array_pop($names);
  32. if(!empty($names))
  33. {
  34. foreach($names as $name)
  35. {
  36. if(!is_array($data) && !is_object($data)) return;
  37. if(is_array($data) && !isset($data[$name])) $data[$name] = array();
  38. if(is_object($data) && !isset($data->$name)) $data->$name = new \stdClass();
  39. $data = &$data[$name];
  40. }
  41. }
  42. if(is_array($data)) $data[$lastName] = $value;
  43. elseif(is_object($data)) $data->$lastName = $value;
  44. }