Пример #1
0
/**
 * 2015-02-18
 * По смыслу функция @see df_extend() аналогична методу @see \Magento\Framework\Simplexml\Element::extend()
 * и предназначена для слияния настроечных опций,
 * только, в отличие от @see \Magento\Framework\Simplexml\Element::extend(),
 * @see df_extend() сливает не XML, а ассоциативные массивы.
 *
 * Обратите внимание, что вместо @see df_extend() нельзя использовать ни
 * @see array_replace_recursive(), ни @see array_merge_recursive(),
 * ни тем более @see array_replace() и @see array_merge()
 * Нерекурсивные аналоги отметаются сразу, потому что не способны сливать вложенные структуры.
 * Но и стандартные рекурсивные функции тоже не подходят:
 *
 * 1)
 * array_merge_recursive(array('width' => 180), array('width' => 200))
 * вернёт: array(array('width' => array(180, 200)))
 * http://php.net/manual/function.array-merge-recursive.php
 * Наша функция df_extend(array('width' => 180), array('width' => 200))
 * вернёт array('width' => 200)
 *
 * 2)
 * array_replace_recursive(array('x' => array('A', 'B')), array('x' => 'C'))
 * вернёт: array('x' => array('С', 'B'))
 * http://php.net/manual/function.array-replace-recursive.php
 * Наша функция df_extend(array('x' => array('A', 'B')), array('x' => 'C'))
 * вернёт array('x' => 'C')
 *
 * @param array(string => mixed) $defaults
 * @param array(string => mixed) $newValues
 * @return array(string => mixed)
 */
function df_extend(array $defaults, array $newValues)
{
    /** @var array(string => mixed) $result */
    // Здесь ошибочно было бы $result = [],
    // потому что если ключ отсутствует в $newValues,
    // то тогда он не попадёт в $result.
    $result = $defaults;
    foreach ($newValues as $key => $newValue) {
        /** @var int|string $key */
        /** @var mixed $newValue */
        /** @var mixed $defaultValue */
        $defaultValue = dfa($defaults, $key);
        if (!is_array($defaultValue)) {
            // 2016-08-23
            // unset добавил сегодня.
            if (is_null($newValue)) {
                unset($result[$key]);
            } else {
                $result[$key] = $newValue;
            }
        } else {
            if (is_array($newValue)) {
                $result[$key] = df_extend($defaultValue, $newValue);
            } else {
                if (is_null($newValue)) {
                    unset($result[$key]);
                } else {
                    // Если значение по умолчанию является массивом,
                    // а новое значение не является массивом,
                    // то это наверняка говорит об ошибке программиста.
                    df_error("df_extend: значением по умолчанию ключа «{$key}» является массив {defaultValue}," . "\nоднако программист ошибочно пытается заместить его" . ' значением {newValue} типа «{newType}», что недопустимо:' . "\nзамещаемое значение для массива должно быть либо массивом, либо «null».", ['{defaultValue}' => df_t()->singleLine(df_dump($defaultValue)), '{newType}' => gettype($newValue), '{newValue}' => df_dump($newValue)]);
                }
            }
        }
    }
    return $result;
}
Пример #2
0
/**
 * 2016-08-22
 * @see dfp_add_info()
 * 2016-08-23
 * Если значением ключа в $info будет null, то предыдущий ключ удалится: @see dfo()
 * @param DataObject|C $c
 * @param array(string => mixed) $info
 * @return void
 */
function df_customer_info_add(DataObject $c, array $info)
{
    $c[Schema::F__DF] = df_json_encode(df_extend(df_customer_info_get($c), $info));
}