Получить значение массива по значениям другого массива

Тема в разделе "Как сделать...", создана пользователем Q_BASIC, 8 дек 2018.

  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    463
    Симпатии:
    1.169
    Приветствую,

    Есть массив неограниченной вложенности:
    Код:
    [a] => Array(
        [b] => Array(
            [c] => 1
        )
    )
    Так же имеется массив из которого надо брать ключи: [a, b, c]

    То есть берем по ключу a, в нем по ключу b и так далее

    Есть ли такая функция в PHP?
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.596
    Симпатии:
    1.508
    Делается через рекурсивный вызов, вот выдрал из yii2:
    PHP:
    class ArrayHelper
    {

        
    /**
         * Retrieves the value of an array element or object property with the given key or property name.
         * If the key does not exist in the array or object, the default value will be returned instead.
         *
         * The key may be specified in a dot format to retrieve the value of a sub-array or the property
         * of an embedded object. In particular, if the key is `x.y.z`, then the returned value would
         * be `$array['x']['y']['z']` or `$array->x->y->z` (if `$array` is an object). If `$array['x']`
         * or `$array->x` is neither an array nor an object, the default value will be returned.
         * Note that if the array already has an element `x.y.z`, then its value will be returned
         * instead of going through the sub-arrays. So it is better to be done specifying an array of key names
         * like `['x', 'y', 'z']`.
         *
         * Below are some usage examples,
         *
         * ```php
         * // working with array
         * $username = \yii\helpers\ArrayHelper::getValue($_POST, 'username');
         * // working with object
         * $username = \yii\helpers\ArrayHelper::getValue($user, 'username');
         * // working with anonymous function
         * $fullName = \yii\helpers\ArrayHelper::getValue($user, function ($user, $defaultValue) {
         *     return $user->firstName . ' ' . $user->lastName;
         * });
         * // using dot format to retrieve the property of embedded object
         * $street = \yii\helpers\ArrayHelper::getValue($users, 'address.street');
         * // using an array of keys to retrieve the value
         * $value = \yii\helpers\ArrayHelper::getValue($versions, ['1.0', 'date']);
         * ```
         *
         * @param array|object $array array or object to extract value from
         * @param string|\Closure|array $key key name of the array element, an array of keys or property name of the object,
         * or an anonymous function returning the value. The anonymous function signature should be:
         * `function($array, $defaultValue)`.
         * The possibility to pass an array of keys is available since version 2.0.4.
         * @param mixed $default the default value to be returned if the specified array key does not exist. Not used when
         * getting value from an object.
         * @return mixed the value of the element if found, default value otherwise
         */
        
    public static function getValue($array$key$default null)
        {
            if (
    $key instanceof \Closure) {
                return 
    $key($array$default);
            }

            if (
    is_array($key)) {
                
    $lastKey array_pop($key);
                foreach (
    $key as $keyPart) {
                    
    $array = static::getValue($array$keyPart);
                }
                
    $key $lastKey;
            }

            if (
    is_array($array) && (isset($array[$key]) || array_key_exists($key$array)) ) {
                return 
    $array[$key];
            }

            if ((
    $pos strrpos($key'.')) !== false) {
                
    $array = static::getValue($arraysubstr($key0$pos), $default);
                
    $key substr($key$pos 1);
            }

            if (
    is_object($array)) {
                
    // this is expected to fail if the property does not exist, or __get() is not implemented
                // it is not reliably possible to check whether a property is accessible beforehand
                
    return $array->$key;
            } elseif (
    is_array($array)) {
                return (isset(
    $array[$key]) || array_key_exists($key$array)) ? $array[$key] : $default;
            } else {
                return 
    $default;
            }
        }
    }


    Для твоего случая как-то так
    PHP:
    $value ArrayHelper::getValue($recursiveArrayarray_keys($arrKeys));
     
    Q_BASIC нравится это.