如何将foreach值存储到子数组中并将其转换为JSON

时间:2018-11-14 05:37:19

标签: php json xml dom

如何存储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和中。

5 个答案:

答案 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);

感谢您的时间和答复。 :)