Exemplo n.º 1
0
/**
 * 2016-08-26
 * Вставляет новые элементы внутрь массива.
 * http://php.net/manual/function.array-splice.php
 * Если нужно вставить только один элемент, то необязательно обрамлять его в массив.
 *
 * 2016-11-23
 * Достоинство этой функции перед @uses array_splice()
 * ещё и в отсутствии требования передачи первого параметра по ссылке.
 *
 * 2016-11-24
 * Отныне функция правильно работает с ассоциативными массивами.
 *
 * @param mixed[] $a
 * @param int $pos
 * @param mixed|mixed[] $add
 * @return mixed[]
 */
function dfa_insert(array $a, $pos, $add)
{
    if (!is_array($add) || !df_is_assoc($add)) {
        array_splice($a, $position, 0, $add);
    } else {
        /**
         * 2016-11-24
         * Отныне функция правильно работает с ассоциативными массивами.
         * http://stackoverflow.com/a/1783125
         */
        $a = array_slice($a, 0, $pos, true) + $add + array_slice($a, $pos, null, true);
    }
    return $a;
}
Exemplo n.º 2
0
Arquivo: X.php Projeto: mage2pro/core
 /**
  * @param array(string => mixed) $array
  * @param string[]|bool $wrapInCData [optional]
  * @return X
  */
 public function importArray(array $array, $wrapInCData = [])
 {
     foreach ($array as $key => $value) {
         /** @var string $key */
         /** @var mixed $value */
         if ($value instanceof X) {
             /**
             * 2016-08-31
             * Случай, который отсутствовал в Российсеой сборке Magento:
             					'Payment' => [
             						df_xml_node('TxnList', ['count' => 1], [
             							df_xml_node('Txn', ['ID' => 1], [
             								'amount' => 200
             								,'purchaseOrderNo' => 'test'
             								,'txnID' => '009887'
             								,'txnSource' => 23
             								,'txnType' => 4
             							])
             						])
             					]
             *
             					<Payment>
             						<TxnList count="1">
             							<Txn ID="1">
             								<txnType>4</txnType>
             								<txnSource>23</txnSource>
             								<amount>200</amount>
             								<purchaseOrderNo>test</purchaseOrderNo>
             								<txnID>009887</txnID>
             							</Txn>
             						</TxnList>
             					</Payment>
             */
             $this->addChildX($value);
         } else {
             if (!is_array($value)) {
                 $this->importString($key, $value, $wrapInCData);
             } else {
                 if (df_is_assoc($value) || array_filter($value, function ($i) {
                     return $i instanceof X;
                 })) {
                     /** @var X $childNode */
                     $childNode = $this->addChild($key);
                     /** @var array|null $childData */
                     $childData = $value;
                     // Данный программный код позволяет импортировать атрибуты тэгов
                     /** @var array(string => string)|null $attributes $attributes */
                     $attributes = dfa($value, self::ATTR);
                     if (!is_null($attributes)) {
                         df_assert_array($attributes);
                         $childNode->addAttributes($attributes);
                         /**
                          * Если $value содержит атрибуты,
                          * то дочерние значения должны содержаться
                          * не непосредственно в $value, а в подмассиве с ключём self::CONTENT
                          */
                         $childData = dfa($value, self::CONTENT);
                     }
                     if (!is_null($childData)) {
                         /**
                         * $childData запросто может не быть массивом.
                         * Например, в такой ситуации:
                         						(
                         							[_attributes] => Array
                         								(
                         									[Код] => 796
                         									[НаименованиеПолное] => Штука
                         									[МеждународноеСокращение] => PCE
                         								)
                         							[_value] => шт
                         						)
                         * Здесь $childData — это «шт».
                         */
                         if (is_array($childData)) {
                             $childNode->importArray($childData, $wrapInCData);
                         } else {
                             $childNode->importString($key = null, $childData, $wrapInCData);
                         }
                     }
                 } else {
                     /**
                     * Данный код позволяет импортировать структуры с повторяющимися тегами.
                     * Например, нам надо сформировать такой документ:
                     					<АдресРегистрации>
                     						<АдресноеПоле>
                     							<Тип>Почтовый индекс</Тип>
                     							<Значение>127238</Значение>
                     						</АдресноеПоле>
                     						<АдресноеПоле>
                     							<Тип>Улица</Тип>
                     							<Значение>Красная Площадь</Значение>
                     						</АдресноеПоле>
                     					</АдресРегистрации>
                     *
                     * Для этого мы вызываем:
                     *
                     					$this->getDocument()
                     						->importArray(
                     							array(
                     				'АдресРегистрации' =>
                     									array(
                     										'АдресноеПоле' =>
                     											array(
                     												array(
                     													'Тип' => 'Почтовый индекс'
                     													,'Значение' => '127238'
                     												)
                     												,array(
                     													'Тип' => 'Улица'
                     													,'Значение' => 'Красная Площадь'
                     												)
                     											)
                     									)
                     							)
                     						)
                     					;
                     *
                     */
                     foreach ($value as $valueItem) {
                         /** @var array(string => mixed)|string $valueItem */
                         /**
                         * 2015-01-20
                         * Обратите внимание, что $valueItem может быть не только массивом, но и строкой.
                         * Например, такая структура:
                         						<Группы>
                         							<Ид>1</Ид>
                         							<Ид>1</Ид>
                         							<Ид>1</Ид>
                         						</Группы>
                         * кодируется так:
                         * array('Группы' => array('Ид' => array(1, 2, 3)))
                         */
                         $this->importArray([$key => $valueItem], $wrapInCData);
                     }
                 }
             }
         }
     }
     return $this;
 }