/** * 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; }
/** * 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)); }