Blame | Last modification | View Log | RSS feed
<?php namespace Fuse\Helpers;
function deep_value($assoc, $path, &$list = [])
{
if (!$path) {
// If there's no path left, we've gotten to the object we care about.
$list[] = $assoc;
} else {
$dotIndex = mb_strpos($path, '.');
$firstSegment = $path;
$remaining = null;
if ($dotIndex !== false) {
$firstSegment = mb_substr($path, 0, $dotIndex);
$remaining = mb_substr($path, $dotIndex + 1);
}
$value = isset($assoc[$firstSegment])
? $assoc[$firstSegment]
: null;
if (!is_null($value)) {
if (!$remaining && (is_string($value) || is_int($value) || is_float($value))) {
$list[] = (string) $value;
} elseif (is_list($value)) {
// Search each item in the array.
for ($i = 0, $len = sizeof($value); $i < $len; $i++) {
deep_value($value[$i], $remaining, $list);
}
} elseif ($remaining) {
// An associative array. Recurse further.
deep_value($value, $remaining, $list);
}
}
}
return $list;
}