| 
<?php
 namespace Fuse\Helpers;
 
 use function Fuse\Helpers\Types\{isArray, isNumber};
 
 /**
 * @return void
 */
 function deepGet($obj, array $path, $index, &$list, &$arr)
 {
 if (is_null($obj)) {
 return;
 }
 
 if (!isset($path[$index])) {
 // If there's no path left, we've arrived at the object we care about.
 $list[] = $obj;
 } else {
 $key = $path[$index];
 $value = $obj[$key] ?? null;
 
 if (is_null($value)) {
 return;
 }
 
 // If we're at the last value in the path, and if it's a string/number/bool,
 // add it to the list
 if (
 $index === sizeof($path) - 1 &&
 (is_string($value) || isNumber($value) || is_bool($value))
 ) {
 $list[] = is_bool($value) ? json_encode($value) : (string) $value;
 } elseif (isArray($value)) {
 $arr = true;
 
 // Search each item in the array.
 for ($i = 0, $len = sizeof($value); $i < $len; $i += 1) {
 deepGet($value[$i], $path, $index + 1, $list, $arr);
 }
 } else {
 // An object. Recurse further.
 deepGet($value, $path, $index + 1, $list, $arr);
 }
 }
 }
 
 function get($obj, $path)
 {
 $list = [];
 $arr = false;
 
 // Backwards compatibility (since path used to be a string)
 deepGet($obj, is_string($path) ? explode('.', $path) : $path, 0, $list, $arr);
 
 return $arr ? $list : $list[0] ?? null;
 }
 
 |