Когда в последний раз вам приходилось извлекать некоторые глубоко вложенные данные в PHP, и в итоге вы писали код, который выглядел примерно так?
$grandchild = isset( $data['parent'], $data['parent']['child'], $data['parent']['child']['grandchild'] ) ? $data['parent']['child']['grandchild'] : null;
В Laravel есть функция, которая позволяет вам получать данные следующим образом: array_get()
$grandchild = array_get( $data, 'parent.child.grandchild' );
Это здорово, но я решил использовать подход Laravel для вдохновения и улучшить его. Я написал аналогичную функцию, но решил расширить ее, чтобы она извлекала не только глубоко вложенные данные из массива, но и из объекта.
Результатом является надежная служебная функция, которая позволяет легко извлекать глубоко вложенные данные из неоднородной многомерной коллекции с использованием точечной нотации :
/**
* Получить значение из объекта или массива. Позволяет возможность получить
вложенное значение из многомерной коллекция с использованием точечной нотации.
*
* @param array|object $data
* @param string $key
* @param mixed $default
* @return mixed
*/
function get_value( $data, $key, $default = null ) {
$value = $default;
if ( is_array( $data ) && array_key_exists( $key, $data ) ) {
$value = $data[$key];
} else if ( is_object( $data ) && property_exists( $data, $key ) ) {
$value = $data->$key;
} else {
$segments = explode( '.', $key );
foreach ( $segments as $segment ) {
if ( is_array( $data ) && array_key_exists( $segment, $data ) ) {
$value = $data = $data[$segment];
} else if ( is_object( $data ) && property_exists( $data, $segment ) ) {
$value = $data = $data->$segment;
} else {
$value = $default;
break;
}
}
}
return $value;
}
Если мы переписываем нашу первоначальную загадку кода с использованием этой функции, она выглядит почти идентично Laravel : array_get()
$grandchild = get_value( $data, 'parent.child.grandchild' );
Однако реальная выгода приходит, когда нам нужен доступ к структуре данных, которая может быть смесью массивов и объектов:
$data['parent']->child['grandchild'];
В этом случае мы извлекаем данные, используя тот же синтаксис, и никогда не встретим неопределенный индекс или не попытаемся получить свойство уведомления, не являющегося объектом, если ключ или свойство не существует. get_value()
Статья была переведена для блога TechBlog.SDStudio.top
Источник: wpscholar.com