/* 测试 */
$std = new stdClass();
$std->name = new stdClass();
$std->name->name = 'China';
//------------------------------------
$data = ['abc'=>['index'=>['db'=>['name'=>'asfsdfs']]]];
var_dump(DataUtils::get($data, 'abc.index.db.name','默认值'));
/**
* php 获取 数组OR对象 中的元素
* 支持多维对象中的元素获取, 中间使用.获取
*/
class DataUtils
{
/**
* 获取数据
*/
public static function get($target, $key, $default = null){
if (is_null($key)) {
return $target;
}
$key = is_array($key) ? $key : explode('.', $key);
foreach ($key as $i => $segment) {
unset($key[$i]);
if (is_null($segment)) {
return $target;
}
if ($segment === '*') {
if ($target instanceof Collection) {
$target = $target->all();
} elseif (! is_array($target)) {
return DataUtils::value($default);
}
$result = [];
foreach ($target as $item) {
$result[] = DataUtils::get($item, $key);
}
return in_array('*', $key) ? DataUtils::collapse($result) : $result;
}
if (DataUtils::accessible($target) && DataUtils::exists($target, $segment)) {
$target = $target[$segment];
} elseif (is_object($target) && isset($target->{$segment})) {
$target = $target->{$segment};
} else {
return DataUtils::value($default);
}
}
return $target;
}
private static function accessible($value){
return is_array($value) || $value instanceof ArrayAccess;
}
/**
* Determine if the given key exists in the provided array.
*
* @param \ArrayAccess|array $array
* @param string|int $key
* @return bool
*/
private static function exists($array, $key){
if ($array instanceof Enumerable) {
return $array->has($key);
}
if ($array instanceof ArrayAccess) {
return $array->offsetExists($key);
}
return array_key_exists($key, $array);
}
private static function collapse($array){
$results = [];
foreach ($array as $values) {
if ($values instanceof Collection) {
$values = $values->all();
} elseif (! is_array($values)) {
continue;
}
$results[] = $values;
}
return array_merge([], ...$results);
}
private static function value($value, ...$args){
return $value instanceof Closure ? $value(...$args) : $value;
}
}
网友评论