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