【问题标题】:Empty key converts into array in multidimentional array in php?空键在php中转换为多维数组中的数组?
【发布时间】:2021-12-02 10:41:20
【问题描述】:

我正在上传一个 xml 并尝试将该数据转换为 php 数组,并且必须将其存储在 db 中。我的问题是当我在循环中获得空键时,它会自动转换为数组。但我只希望它作为一个字符串。由于我正在获取数组,因此我很难将其存储在数据库中。请帮助我解决问题。

电流输出:

array(19) {
  ["EMP_NAME"]=>
  string(12) "ABC"
  ["EMP_ADDRESS"]=>
  string(1) "MUMBAI"
  ["DEPARTMENT"]=>
  string(1) "IT"
  ["LOCATION"]=>
  array(0) {
  }
}

预期输出:

array(19) {
  ["EMP_NAME"]=>
  string(12) "ABC"
  ["EMP_ADDRESS"]=>
  string(1) "MUMBAI"
  ["DEPARTMENT"]=>
  string(1) "IT"
  ["LOCATION"]=>
  string(1) ""
}

这是我的 php 代码,用于从 xml 获取数据并遍历数组。

 $xml = file_get_contents('uploads/data.xml');
    $xml = simplexml_load_string($xml);
    $xml_array = json_decode(json_encode((array) $xml), 1);
    $data = ($xml_array);
    foreach($data as  $val){
       //var_dump($val);
    }

【问题讨论】:

    标签: php xml multidimensional-array foreach


    【解决方案1】:

    得到后我尝试修复它。

    <?php
        function fixContent(&$val, $key = null) {
            if (is_array($val)) {
                if (!$val) $val = '';
                else fix($val);
            }
        }
        
        function fix(&$arr) {
            array_walk($arr, 'fixContent');
            array_walk_recursive($arr, 'fixContent');
        }
    
        $xml = "<?xml version='1.0'?> 
    <document>
     <title>Forty What?</title>
     <from>Joe</from>
     <to>Jane</to>
     <body></body>
    </document>";
        $xml = simplexml_load_string($xml);
        $xml_array = json_decode(json_encode((array) $xml), 1);
        fix($xml_array);
        $data = $xml_array;
        var_dump($data);
    ?>
    

    输出:

    array(4) {
      ["title"]=>
      string(11) "Forty What?"
      ["from"]=>
      string(3) "Joe"
      ["to"]=>
      string(4) "Jane"
      ["body"]=>
      string(0) ""
    }
    

    演示:https://paiza.io/projects/qQC5pfvhGz_FniCIK6S_9g

    【讨论】:

      【解决方案2】:

      通用转换通常不是最佳解决方案。它们允许源控制输出 - 特别是如果您使用诸如序列化 SimpleXMLElement 实例之类的调试功能。

      从 XML 中读取数据并将其添加到结果中。这使您的代码可以控制输出。您可以更改键、验证和转换值、添加默认值...

      $xml = <<<'XML'
      <EMP>
        <EMP_NAME>ABC</EMP_NAME>
        <EMP_ADDRESS>MUMBAI</EMP_ADDRESS>
        <DEPARTMENT>IT</DEPARTMENT>
        <LOCATION></LOCATION>
      </EMP>
      XML;
      
      $employee = new SimpleXMLElement($xml);
      
      $result = [
        'EMP_NAME' => (string)$employee->EMP_NAME,
        'EMP_ADDRESS' => (string)$employee->EMP_ADDRESS,
        'DEPARTMENT' => (string)$employee->DEPARTMENT,
        'LOCATION' => (string)$employee->LOCATION 
      ];
      
      var_dump($result);
      

      输出:

      array(4) {
        ["EMP_NAME"]=>
        string(3) "ABC"
        ["EMP_ADDRESS"]=>
        string(6) "MUMBAI"
        ["DEPARTMENT"]=>
        string(2) "IT"
        ["LOCATION"]=>
        string(0) ""
      }
      

      或者使用 DOM:

      $document = new DOMDocument();
      $document->loadXML($xml);
      $xpath = new DOMXpath($document);
      
      $result = [
        'EMP_NAME' => $xpath->evaluate('string(/EMP/EMP_NAME)'),
        'EMP_ADDRESS' => $xpath->evaluate('string(/EMP/EMP_ADDRESS)'),
        'DEPARTMENT' => $xpath->evaluate('string(/EMP/DEPARTMENT)'),
        'LOCATION' => $xpath->evaluate('string(/EMP/LOCATION)')
      ];
      
      var_dump($result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        相关资源
        最近更新 更多