I am trying to create an array to reproduce the code below:
<div class="singlepost">
<ul class="linha_status" style="">
<li>Status: <b>Objeto em trânsito - por favor aguarde</b></li>
<li>Data : 24/10/2021 | Hora: 12:04</li>
<li>Origem: Unidade de Tratamento - Jaboatao Dos Guararapes / PE</li>
<li>Destino: Agência dos Correios - Cuitegi / PB</li>
</ul>
<ul class="linha_status" style="">
<li>Status: <b>Objeto em trânsito - por favor aguarde</b></li>
<li>Data : 19/10/2021 | Hora: 00:03</li>
<li>Origem: Unidade de Logística Integrada - Curitiba / PR</li>
<li>Destino: Unidade de Tratamento - Recife / PE</li>
</ul>
<ul class="linha_status" style="">
<li>Status: <b>Fiscalização aduaneira finalizada</b></li>
<li>Data : 18/10/2021 | Hora: 23:35</li>
<li>Local: Unidade Operacional - Curitiba / PR</li>
</ul>
<ul class="linha_status" style="">
<li>Status: <b>Objeto recebido pelos Correios do Brasil</b></li>
<li>Data : 16/10/2021 | Hora: 11:45</li>
<li>Local: Unidade de Logística Integrada - Curitiba / PR</li>
</ul>
<ul class="linha_status" style="">
<li>Status: <b>Objeto postado</b></li>
<li>Data : 14/10/2021 | Hora: 20:30</li>
<li>Local: País - / </li>
</ul>
</div>
I am using xpath and foreach to create the array, but got no lucky with the result... It is working, but not the output I need, this is the code I have written:
$doc = new DOMDocument();
$doc->loadHTML($htmlString);
$xpath = new DOMXPath($doc);
$geral = $xpath->evaluate('//ul[@class="linha_status"]');
foreach ($geral as $name) {
$total[] = $name->nodeValue;
}
var_dump($total);
My actual code produces this output:
array(5) {
[0] => string(195)
" Status: Objeto em trânsito - por favor aguarde Data : 24/10/2021 | Hora: 12:04 Origem: Unidade de Tratamento - Jaboatao Dos Guararapes / PE Destino: Agência dos Correios - Cuitegi / PB"
[1] => string(189)
" Status: Objeto em trânsito - por favor aguarde Data : 19/10/2021 | Hora: 00:03 Origem: Unidade de Logística Integrada - Curitiba / PR Destino: Unidade de Tratamento - Recife / PE"
[2] => string(128)
" Status: Fiscalização aduaneira finalizada Data : 18/10/2021 | Hora: 23:35 Local: Unidade Operacional - Curitiba / PR"
[3] => string(145)
" Status: Objeto recebido pelos Correios do Brasil Data : 16/10/2021 | Hora: 11:45 Local: Unidade de Logística Integrada - Curitiba / PR"
[4] => string(83)
" Status: Objeto postado Data : 14/10/2021 | Hora: 20:30 Local: País - / "
}
This is my desired output:
"eventos": [{
"status": "Objeto em trânsito - por favor aguarde",
"data": "24/10/2021",
"hora": "12:04",
"origem": "Unidade de Tratamento - Jaboatao Dos Guararapes / PE",
"destino": "Agência dos Correios - Cuitegi / PB"
}, {
"status": "Objeto em trânsito - por favor aguarde",
"data": "19/10/2021",
"hora": "00:03",
"origem": "Unidade de Logística Integrada - Curitiba / PR",
"destino": "Unidade de Tratamento - Recife / PE"
}, {
"status": "Fiscalização aduaneira finalizada",
"data": "18/10/2021",
"hora": "23:35",
"local": "Unidade Operacional - Curitiba / PR"
}, {
"status": "Objeto recebido pelos Correios do Brasil",
"data": "16/10/2021",
"hora": "11:45",
"local": "Unidade de Logística Integrada - Curitiba / PR"
}, {
"status": "Objeto postado",
"data": "14/10/2021",
"hora": "20:30",
"local": "País - /"
}]
My Answer:
To achieve the desired output, you need to modify your code to extract the individual elements (status, data, hora, origem, destino) from each `
- ` element and then create an array with those elements. Here's the updated code:
php
$doc = new DOMDocument();
$doc->loadHTML($htmlString);
$xpath = new DOMXPath($doc);
$geral = $xpath->evaluate('//ul[@class="linha_status"]');
$total = [];
foreach ($geral as $ul) {
$item = [];
$liList = $ul->getElementsByTagName('li');
foreach ($liList as $li) {
$text = $li->nodeValue;
$parts = explode(':', $text);
$key = trim($parts[0]);
$value = trim($parts[1]);
switch ($key) {
case 'Status':
$item['status'] = $value;
break;
case 'Data':
$item['data'] = substr($value, 0, 10);
$item['hora'] = substr($value, 13);
break;
case 'Origem':
$item['origem'] = $value;
break;
case 'Destino':
$item['destino'] = $value;
break;
case 'Local':
$item['local'] = $value;
break;
}
}
$total['eventos'][] = $item;
}
echo json_encode($total, JSON_PRETTY_PRINT);
This code will extract the status, data, hora, origem, and destino/local from each `
- ` element and create an array with those elements. Finally, it will output the array as a JSON string with the desired format.
Rate this post
3 of 5 based on 3921 votesComments