2011-10-15 36 views
16

Xét đoạn mã sau:Làm thế nào để chuyển đổi SimpleXMLObject thành PHP Array?

$string = '<device> 
    <id>1234</id> 
    <label>118</label> 
    <username>root</username> 
    <password>helloWorld</password> 
    <hardware> 
     <memory>4GB RAM</memory> 
     <storage_drives> 
      <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1> 
      <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2> 
      <storage_drive_3>Not Applicable</storage_drive_3> 
      <storage_drive_4>Not Applicable</storage_drive_4> 
     </storage_drives> 
    </hardware> 
</device>'; 
$xml = new SimpleXMLElement($string); 

$deviceDetails = Array(); 
foreach($xml as $element){ 
    $tag = $element->getName(); 
    $deviceDetails += Array($tag => '$element->$tag)', 
     ); 
    } 

Output $detailsDetails mảng như sau:

Array 
(
    [id] => $element->$tag) 
    [label] => $element->$tag) 
    [username] => $element->$tag) 
    [password] => $element->$tag) 
    [hardware] => $element->$tag) 
) 

đó là sai.

Câu hỏi của tôi là, cách tạo $element->$tag hoạt động?

+1

Sử dụng dấu ngoặc kép thay vì dấu nháy đơn (hoặc không có gì cả) –

Trả lời

15

Book Of Zeus đang được bọc trong chức năng để làm cho nó hoạt đệ quy:

function xml2array($xml) 
{ 
    $arr = array(); 

    foreach ($xml as $element) 
    { 
     $tag = $element->getName(); 
     $e = get_object_vars($element); 
     if (!empty($e)) 
     { 
      $arr[$tag] = $element instanceof SimpleXMLElement ? xml2array($element) : $e; 
     } 
     else 
     { 
      $arr[$tag] = trim($element); 
     } 
    } 

    return $arr; 
} 

$xml = new SimpleXMLElement($string); 
print_r(xml2array($xml)); 

Array 
(
    [id] => 1234 
    [label] => 118 
    [username] => root 
    [password] => helloWorld 
    [hardware] => Array 
    (
     [memory] => 4GB RAM 
     [storage_drives] => Array 
     (
      [storage_drive_1] => 2TB SATA 7,200RPM 
      [storage_drive_2] => 1TB SATA 7,200RPM 
      [storage_drive_3] => Not Applicable 
      [storage_drive_4] => Not Applicable 
     ) 
    ) 
) 
+7

+1 thực hành tốt Tôi thích rằng –

+1

@dfsq - điều này dường như không hoạt động thông qua toàn bộ mảng, nó giống như nó chỉ trả về mục nhập đầu tiên cho tôi ... là có thể? – Shackrock

+0

@Shackrock Kiểm tra giải pháp từ Book Of Zeus – Hoa

17

Hãy thử điều này:

$string = '<device> 
    <id>1234</id> 
    <label>118</label> 
    <username>root</username> 
    <password>helloWorld</password> 
    <hardware> 
    <memory>4GB RAM</memory> 
    <storage_drives> 
     <storage_drive_1>2TB SATA 7,200RPM</storage_drive_1> 
     <storage_drive_2>1TB SATA 7,200RPM</storage_drive_2> 
     <storage_drive_3>Not Applicable</storage_drive_3> 
     <storage_drive_4>Not Applicable</storage_drive_4> 
    </storage_drives> 
    </hardware> 
</device>'; 

$xml = json_decode(json_encode((array) simplexml_load_string($string)), 1); 

Sản lượng này sẽ:

Array 
(
    [id] => 1234 
    [label] => 118 
    [username] => root 
    [password] => helloWorld 
    [hardware] => Array 
     (
      [memory] => 4GB RAM 
      [storage_drives] => Array 
       (
        [storage_drive_1] => 2TB SATA 7,200RPM 
        [storage_drive_2] => 1TB SATA 7,200RPM 
        [storage_drive_3] => Not Applicable 
        [storage_drive_4] => Not Applicable 
       ) 

     ) 

) 

hoặc nếu bạn không thích điều này, bạn có thể sử dụng một lớp PHP như: http://www.bin-co.com/php/scripts/xml2array/

hoặc xem dfsq trả lời

+0

Nó không làm việc đệ quy. [storage_drives] => Đối tượng SimpleXMLElement. – dfsq

+0

Bạn đúng, bạn cần tất cả chúng dưới dạng mảng? –

+0

@Gaurish Tôi đã cập nhật câu trả lời của mình –

3

Hãy thử này:

$array = json_decode(json_encode((array)$xml), TRUE); 
+0

Chào mừng bạn đến với Stack Overflow! Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và/hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó. – ryanyuyu

+0

Cảm ơn bạn đã tiết kiệm rất nhiều thời gian .... –

Các vấn đề liên quan