2016-01-19 2 views
-1

У меня есть файл xml, который я пытаюсь превратить в массив, но я хочу, чтобы ключи были индексами, если они представляют собой массив else, чтобы просто добавить ключ к текущему массиву, или разбивать каждый массив на глобальную переменную. Ниже приведен пример. Однако из этого я могу придавить только массив, у меня есть более обширный код доступен по адресу: https://github.com/mithereal/xml-to-struct-goКак поместить многораздельный массив по ключам

class RecursiveRealArrayIterator extends RecursiveArrayIterator 
    { 
    public function hasChildren() 
    { 
     $current = $this->current(); 
     return is_array($current) || $current instanceof Traversable; 
    } 
    } 

$xml = '<?xml version="1.0" encoding="utf-8"?> 
<GetOrdersRequest xmlns="urn:ebay:apis:eBLBaseComponents"> 
    <!-- Call-specific Input Fields --> 
    <CreateTimeFrom> dateTime </CreateTimeFrom> 
    <CreateTimeTo> dateTime </CreateTimeTo> 
    <IncludeFinalValueFee> boolean </IncludeFinalValueFee> 
    <ListingType> ListingTypeCodeType </ListingType> 
    <ModTimeFrom> dateTime </ModTimeFrom> 
    <ModTimeTo> dateTime </ModTimeTo> 
    <NumberOfDays> int </NumberOfDays> 
    <OrderIDArray> OrderIDArrayType 
    <OrderID> OrderIDType (string) </OrderID> 
    <!-- ... more OrderID values allowed here ... --> 
    </OrderIDArray> 
    <OrderRole> TradingRoleCodeType </OrderRole> 
    <OrderStatus> OrderStatusCodeType </OrderStatus> 
    <Pagination> PaginationType 
    <EntriesPerPage> int </EntriesPerPage> 
    <PageNumber> int </PageNumber> 
    </Pagination> 
    <SortingOrder> SortOrderCodeType </SortingOrder> 
    <!-- Standard Input Fields --> 
    <DetailLevel> DetailLevelCodeType </DetailLevel> 
    <!-- ... more DetailLevel values allowed here ... --> 
    <ErrorLanguage> string </ErrorLanguage> 
    <MessageID> string </MessageID> 
    <OutputSelector> string </OutputSelector> 
    <!-- ... more OutputSelector values allowed here ... --> 
    <Version> string </Version> 
    <WarningLevel> WarningLevelCodeType </WarningLevel> 
</GetOrdersRequest>' 

$flat = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); return iterator_to_array($it, true); 

function XMLToArray($xml) 
    { 
     $return = false; 

     if ($xml instanceof SimpleXMLElement) { 
      $children = $xml->children(); 
      $return = false; 

      foreach ($children as $element => $value) { 
       if ($value instanceof SimpleXMLElement) { 
        $values = (array)$value->children(); 

        if (count($values) > 0) { 
         $return[$element] = $this->XMLToArray($value); 
        } else { 
         if (!isset($return[$element])) { 
          $return[$element] = (string)$value; 
         } else { 
          if (!is_array($return[$element])) { 
           $return[$element] = array($return[$element], (string)$value); 
          } else { 
           $return[$element][] = (string)$value; 
          } 
         } 
        } 
       } 
      } 

     } 

     return $return; 

    } 

class object(){ 
var properties 
function newproperty($array, $i) 
{ 

    $this->properties[$i] = $array; 

    if (is_array($array)) { 
     $i++; 
     $this->newproperty($array,$i); 

    } 


return $array; 
} 

function make($array) 
{ 
    $i = 0; 
    foreach ($array as $dim) { 
     $this->newproperty($dim, $i); 
     $i++; 
    } 
    return $this->properties; 
} 
} 
$structs = obj::make($arr) 
+0

Вы можете оставить матричную структуру с ожидаемый результат –

+0

, если у вас нет атрибутов, тогда используйте библиотеку simplexml – Sundar

+0

, они должны быть отдельными массивами, как что-то вроде этого ... GetOrdersRequest []; GetOrdersRequest [CreateTimeFrom]; GetOrdersRequest [CreateTimeTo]; GetOrdersRequest [IncludeFinalValueFee]; GetOrdersRequest [ListingType]; GetOrdersRequest [WarningLevel]; ... OrderIDArray [OrderID]; .. Pagination [EntriesPerPage]; – mithereal

ответ

0

Вы можете использовать эту функцию, чтобы получить результат, как показано ниже

<?php 

$xml = '<?xml version="1.0" encoding="utf-8"?> 
<GetOrdersRequest xmlns="urn:ebay:apis:eBLBaseComponents"> 
    <!-- Call-specific Input Fields --> 
    <CreateTimeFrom> dateTime </CreateTimeFrom> 
    <CreateTimeTo> dateTime </CreateTimeTo> 
    <IncludeFinalValueFee> boolean </IncludeFinalValueFee> 
    <ListingType> ListingTypeCodeType </ListingType> 
    <ModTimeFrom> dateTime </ModTimeFrom> 
    <ModTimeTo> dateTime </ModTimeTo> 
    <NumberOfDays> int </NumberOfDays> 
    <OrderIDArray> OrderIDArrayType 
    <OrderID> OrderIDType (string) </OrderID> 
    <!-- ... more OrderID values allowed here ... --> 
    </OrderIDArray> 
    <OrderRole> TradingRoleCodeType </OrderRole> 
    <OrderStatus> OrderStatusCodeType </OrderStatus> 
    <Pagination> PaginationType 
    <EntriesPerPage> int </EntriesPerPage> 
    <PageNumber> int </PageNumber> 
    </Pagination> 
    <SortingOrder> SortOrderCodeType </SortingOrder> 
    <!-- Standard Input Fields --> 
    <DetailLevel> DetailLevelCodeType </DetailLevel> 
    <!-- ... more DetailLevel values allowed here ... --> 
    <ErrorLanguage> string </ErrorLanguage> 
    <MessageID> string </MessageID> 
    <OutputSelector> string </OutputSelector> 
    <!-- ... more OutputSelector values allowed here ... --> 
    <Version> string </Version> 
    <WarningLevel> WarningLevelCodeType </WarningLevel> 
</GetOrdersRequest>'; 

//create xml object 
$obj = simplexml_load_string($xml); 

//object to array 
$array = get_object_vars($obj); 

print_r($array); 
+0

, который не работает, он не возвращается правильно, он выводит первый уровень правильно, тогда массивы theres я должен войти в с логикой цикла, я хочу, чтобы все массивы в коллекции/наборе были помещены на 1 diminsion/plane, я попытался использовать хвостовую рекурсию, но он просто взорвался, я добавил к вопросу – mithereal

+0

, нет другого пути с моей стороны, вам нужно использовать цикл только. Это не является правильным XML тоже PaginationType Int INT эти детали должны быть в атрибутах (PaginationType) или в тегах. – Sundar

+0

вы можете напрямую использовать объект '$ obj-> CreateTimeFrom', пока не понадобится массив. только определенные места, в которых вы можете использовать цикл – Sundar

Смежные вопросы