Tôi cần phải đệ quy truyền một PHP SimpleXMLObject vào một mảng. Vấn đề là mỗi phần tử con cũng là một SimpleXMLElement của PHP.Truyền đệ quy từ SimpleXMLObject đến Array
Điều này có khả thi không?
Tôi cần phải đệ quy truyền một PHP SimpleXMLObject vào một mảng. Vấn đề là mỗi phần tử con cũng là một SimpleXMLElement của PHP.Truyền đệ quy từ SimpleXMLObject đến Array
Điều này có khả thi không?
json_decode(json_encode((array) simplexml_load_string($obj)), 1);
Không kiểm tra thế này, nhưng điều này dường như làm cho nó thực hiện:
function convertXmlObjToArr($obj, &$arr)
{
$children = $obj->children();
foreach ($children as $elementName => $node)
{
$nextIdx = count($arr);
$arr[$nextIdx] = array();
$arr[$nextIdx]['@name'] = strtolower((string)$elementName);
$arr[$nextIdx]['@attributes'] = array();
$attributes = $node->attributes();
foreach ($attributes as $attributeName => $attributeValue)
{
$attribName = strtolower(trim((string)$attributeName));
$attribVal = trim((string)$attributeValue);
$arr[$nextIdx]['@attributes'][$attribName] = $attribVal;
}
$text = (string)$node;
$text = trim($text);
if (strlen($text) > 0)
{
$arr[$nextIdx]['@text'] = $text;
}
$arr[$nextIdx]['@children'] = array();
convertXmlObjToArr($node, $arr[$nextIdx]['@children']);
}
return;
}
Điều này không hiệu quả đối với tôi –
Không chắc chắn cách này "không hoạt động" cho người khác, nhưng công việc lặp lại qua tất cả trẻ em và thuộc tính. –
nó không đọc CDATA – reggie
Có thể. Đây là một hàm đệ quy in ra các thẻ của các phần tử cha và các thẻ + nội dung của các phần tử không có nhiều con. Bạn có thể thay đổi nó để xây dựng một mảng:
foreach($simpleXmlObject as $element)
{
recurse($element);
}
function recurse($parent)
{
echo '<' . $parent->getName() . '>' . "\n";
foreach($parent->children() as $child)
{
if(count($child->children()) > 0)
{
recurse($child);
}
else
{
echo'<' . $child->getName() . '>';
echo iconv('UTF-8', 'ISO-8859-1', $child);
echo '</' . $child->getName() . '>' . "\n";
}
}
echo'</' . $parent->getName() . '>' . "\n";
}
Tôi không nhìn thấy điểm từ SimpleXMLObject có thể được threated giống như mảng anyway ...
Nhưng nếu bạn thực sự cần điều đó, chỉ cần kiểm tra câu trả lời của chassagnette trong số this thread hoặc this post trong diễn đàn.
Ngoại trừ trường hợp khi bạn muốn lưu trữ nó trong một phiên, nhận được 'Tuần tự hóa' SimpleXMLElement 'không phải là được phép' khi tôi thử điều đó. Do đó việc đúc thành mảng là hữu ích –
@GromBeestje: XML đã được đăng. Không có vấn đề gì để lưu trữ một chuỗi trong một phiên :) – hakre
Phân tích cú pháp chuỗi XML mỗi lần tải tập lệnh có vẻ không hiệu quả, do đó tôi nghĩ rằng lưu trữ một biểu mẫu được phân tích cú pháp có ý nghĩa. –
thông minh! Tôi đã không bao giờ nghĩ để làm điều đó. –
Tôi đã cho bạn 100 phiếu bầu nếu có thể. Chỉ tuyệt vời của nó :) –
Thông minh nhưng dễ đọc, dễ bảo trì và thanh lịch. – Eddified