Я загружаю один 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);
    }
0
amit sutar 14 Окт 2021 в 04:48

2 ответа

Лучший ответ

Попытался починить после получения.

<?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

0
Raven Murphy 14 Окт 2021 в 04:58

Универсальные преобразования часто - не лучшее решение. Они позволяют источнику управлять выводом, особенно если вы используете функции отладки, такие как сериализация экземпляра 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);
0
ThW 14 Окт 2021 в 07:50