0
112
2018-02-23

Извлекаем глубоко вложенные данные в PHP

Рассмотрим PHP функцию которая позволит Вам извлекать данные из сложных многомерных массивов.
Понравилась страница? Поставь свою оценку!
PLUGIN_STAR_RATINGS.SCORE_TEXTPLUGIN_STAR_RATINGS.VOTES_TEXT

Когда в последний раз вам приходилось извлекать некоторые глубоко вложенные данные в 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 для вдохновения и улучшить его. Я написал аналогичную функцию, но решил расширить ее, чтобы она извлекала не только глубоко вложенные данные из массива, но и из объекта.

Результатом является надежная служебная функция, которая позволяет легко извлекать глубоко вложенные данные из неоднородной многомерной коллекции с использованием точечной нотации :

<?php
/**
 * Получить значение из объекта или массива. Позволяет возможность получить 
 вложенное значение из многомерной коллекция с использованием точечной нотации.
 *
 * @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