如何存储foreach值int子数组?我的data []数组返回空值。
foreach( $domNode -> childNodes as $node) {
if ( $node -> hasChildNodes() ) { json2xml( $node ); }
else {
if ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue) ) {
$domNode -> setAttribute( "nodeValue", $node -> textContent );
$sub_array = array();
$sub_array["firstname"] = $node -> nodeValue = "";
$sub_array["lastname"] = $node -> nodeValue = "";
$sub_array["email"] = $node -> nodeValue = "";
$sub_array["username"] = $node -> nodeValue = "";
$sub_array["is_block"] = $node -> nodeValue = "";
$data[] = $sub_array;
}
}
}
如何将这些值存储到子数组中? 我想使用PHP将XML数据转换为JSON编码,然后将其放入jQuery Datatables。然后,我使用foreach来调用我的元素并将其存储到array和中。
答案 0 :(得分:0)
我相信这里的问题是您=
两次都无法将值存储到数组中,请在脚本下面尝试
$sub_array = array();
$data= array();
foreach( $domNode -> childNodes as $node) {
if ( $node -> hasChildNodes() ) { json2xml( $node ); }
else {
if ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue ) ) {
$domNode -> setAttribute( "nodeValue", $node -> textContent );
$sub_array["firstname"] = $node->nodeValue;
$sub_array["lastname"] = $node->nodeValue;
$sub_array["email"] = $node->nodeValue;
$sub_array["username"] = $node->nodeValue;
$sub_array["is_block"] = $node->nodeValue;
$data[] = $sub_array;
}
}
}
答案 1 :(得分:0)
$data = array();
foreach( $domNode -> childNodes as $node) {
if ( $node -> hasChildNodes() ) {
json2xml( $node ); }
elseif ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue ) ) {
$domNode -> setAttribute( "nodeValue", $node -> textContent );
$sub_array = array();
$sub_array["firstname"] = $node->nodeValue;
$sub_array["lastname"] = $node->nodeValue;
$sub_array["email"] = $node->nodeValue;
$sub_array["username"] = $node->nodeValue;
$sub_array["is_block"] = $node->nodeValue;
$data[] = $sub_array;
}
}
答案 2 :(得分:0)
试试这个兄弟。
$sub_array = array();
$count = 0;
if( $domNode->childNodes OR !empty( $domNode->childNodes)){
foreach( $domNode->childNodes as $node) {
if ( $node->hasChildNodes() ) { json2xml( $node ); }
else {
if ( $domNode->hasAttributes() && strlen( $domNode->nodeValue ) ) {
$domNode->setAttribute( "nodeValue", $node->textContent );
$sub_array[$count]["firstname"] = $node->nodeValue;
$sub_array[$count]["lastname"] = $node->nodeValue;
$sub_array[$count]["email"] = $node->nodeValue;
$sub_array[$count]["username"] = $node->nodeValue;
$sub_array[$count]["is_block"] = $node->nodeValue;
$count++;
}
}
}
}
答案 3 :(得分:0)
$sub_array["firstname"] = $node->nodeValue = "";
将首先用空字符串替换$node
的全部内容-删除所有内容。之后,它将空字符串分配给$sub_array["firstname"]
。
然后您将相同的$node->nodeValue
分配给所有不同的数组元素。您的代码看起来像是部分通用转换和某些部分特定的分配。在DOM节点上调用函数json2xml()
对我来说意义不大。
因此,这是一个使用DOM读取特定XML的小示例。可以使用DOM方法,但是使用Xpath会容易得多:
$xml = <<<'XML'
<persons>
<person>
<firstname>Jane</firstname>
<lastname>Doe</lastname>
</person>
</persons>
XML;
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$persons = [];
foreach ($xpath->evaluate('/persons/person') as $personNode) {
$persons[] = [
'firstname' => $xpath->evaluate('string(firstname)', $personNode),
'lastname' => $xpath->evaluate('string(lastname)', $personNode)
];
}
var_dump($persons);
输出:
array(1) {
[0]=>
array(2) {
["firstname"]=>
string(4) "Jane"
["lastname"]=>
string(3) "Doe"
}
}
DOMXpath::evaluate()
的结果取决于Xpath表达式。 /persons/person
将始终返回节点列表。如果person
文档元素节点中没有persons
元素节点,它将返回一个空列表。
string(firstname)
将获取提供的上下文(firstname
)的所有$personNode
个子元素节点,并将找到的第一个节点转换为字符串。如果这里不匹配,它将返回一个空字符串。
Xpath允许使用组合条件和嵌套条件进行非常复杂的表达。这样,您就可以避免PHP源代码中的很多复杂性(循环条件)。
答案 4 :(得分:0)
我终于解决了。
$file = @file_get_contents('user.xml', FILE_TEXT);
$xml = new SimpleXMLElement($file);
$output = @$xml->xpath('/accounts/details');
$outputt = array(
"draw" => intval($_POST["draw"]),
"data" => $output
);
echo json_encode($outputt);
感谢您的时间和答复。 :)