【问题标题】:How to Store foreach value into subarray and turn it in to JSON如何将 foreach 值存储到子数组中并将其转换为 JSON
【发布时间】:2019-04-17 00:59:22
【问题描述】:

如何存储 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 数据表中。我使用 foreach 调用我的元素并将其存储到数组中。

【问题讨论】:

  • 为什么=中有两次$sub_array["firstname"] = $node -> nodeValue = "";
  • 嗨。我对子数组不熟悉,我只是一个初学者。我想知道如何正确使用子数组

标签: php json xml dom


【解决方案1】:

我相信问题是你是 = 两次,这会阻止将值存储到数组中,试试下面的脚本

$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;           
            }
        }
    }

【讨论】:

  • 什么都没有发生
【解决方案2】:
$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;           
    }
}

【讨论】:

  • 您能为 OP 和未来的读者添加对您的代码的解释吗?
  • 您好,我想使用 PHP 将我的 XML 转换为 JSON。我使用 foreach 调用我的元素并将其存储到数组中
【解决方案3】:

试试这个兄弟。

     $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++;       
           }
        }
      }
     }

【讨论】:

  • 如果有的话,最好先var_dump() $node。然后您可以按条件将其捕获
【解决方案4】:

$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 将始终返回一个节点列表。如果persons 文档元素节点内没有person 元素节点,它将返回一个空列表。

string(firstname) 将获取所提供上下文 ($personNode) 的所有 firstname 子元素节点,并将第一个找到的节点转换为字符串。如果这里不匹配,它将返回一个空字符串。

Xpath 允许具有组合和嵌套条件的相当复杂的表达式。这使您可以避免 PHP 源代码中的大量复杂性(循环条件)。

【讨论】:

    【解决方案5】:

    我终于解决了。以这种方式。

    $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);
    

    感谢您的宝贵时间和回答。 :)

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2015-07-05
      • 2021-02-03
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多