Data referring to images getting repeated when reading XML

1

I'm trying to fetch image data from a xml but I'm having difficulty doing so, the record I'm reading is being superimposed. I made a first foreach and I get the date I need, but I need to enter one more level to get data from some images and I can not, the code even searches the first record correctly but in the sequence this overlay occurs. The code I have is this:

require_once ('../Connections/conn.php');

mysql_select_db($database_conn, $conn);
$query_rcCidades = "SELECT * FROM PrevisaoCidade WHERE PrevisaoCidade.ativo = 1 ORDER BY PrevisaoCidade.IdCidade";
$rcCidades = mysql_query($query_rcCidades, $conn) or die(mysql_error());
$row_rcCidades = mysql_fetch_assoc($rcCidades);
$totalRows_rcCidades = mysql_num_rows($rcCidades);

do {

    // CIDADES CADASTRADAS
    $cCidades = 6683;

    $urlIcon = 'http://api.climatempo.com.br/api/v1/forecast/15days/icon?idlocale="'.$cCidades.'"';

    // PERMISSÃO 
    $post = array(
        'key' => '', // chave de pedido
        'client' => '', // login do cliente
        'nocache' => true, // desabilitar cache
        'type' => 'xml', // tipo de retorno json ou xml
        'application' => 'Previsão 15 dias - Cidades'
    ); 

    // OBTENDO PERMISSÃO  
    $http = array(  
        'method' => 'POST',  
        'header' => 'Content-type: application/x-www-form-urlencoded',  
        'content' => http_build_query($post)  
    );  

    $context = stream_context_create(array('http' => $http));   

    // ÍCONE
    $request = file_get_contents($urlIcon, true, $context); 
    $itemIcone =  simplexml_load_string($request); 


    // SELECIONANDO ÍCONE
    $IcoManha = null;
    $IcoTarde = null;
    $IcoNoite = null;
    $IcoDia = null;     

    // A VARIÁVEL $ItemIcone CONTÉM O XML CARREGADO
    foreach($itemIcone->data->item->weather->item as $reg) {   

        // ZERANDO O ARRAY
        $data = array();


            // ÍCONES  
            $data['api']['data']['item']['weather']['item'][] = array 
            (
                // LENDO OS NÓS
                'date' => (string)$reg['date'],

            );

            $Data = $data['api']['data']['item']['weather']['item'][0]['date'];     


            // SEGUNDO FOREACH PARA BUSCAR AS IMAGENS
            // A VARIÁVEL $ItemIcone CONTÉM O XML CARREGADO
            foreach($itemIcone->data->item->weather->item->icon as $regs) {  

                $dataIcon = array();

                $dataIcon['api']['data']['item']['weather']['item']['icon'][] = array 
                (
                    // LENDO OS NÓS
                    'morning' => (string)$regs['morning'],
                    'afternoon' => (string)$regs['afternoon'],
                    'night' => (string)$regs['night'],
                    'day' => (string)$regs['day'],

                );

                // ATRIBUINDO AS VARIÁVEIS  
                $IcoManha = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['morning'];
                $IcoTarde = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['afternoon'];
                $IcoNoite = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['night'];
                $IcoDia   = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['day'];                  

            }

            echo "DATA: " . $Data . " MANHA:" . $IcoManha . " TARDE: " . $IcoTarde . " NOITE: " . $IcoNoite . " DIA: " . $IcoDia . "
"; // echo "DATA: " . $Data . "MANHA:" . $IcoManha . " TARDE: " . $IcoTarde . " NOITE: " . $IcoNoite . " DIA: " . $IcoDia . "
"; } } while ($row_rcCidades = mysql_fetch_assoc($rcCidades));

The xml is this:

Theattemptpreviewresultsinthis:

    
asked by anonymous 02.05.2017 / 21:08

1 answer

1

In fact they are not repeating themselves or overlapping, you are altering the value so that it is ALWAYS the same, thanks to the second foreach . For you to understand better do this test:

    <!-- codigo anterior -->

    echo "DATA: ". $Data; // coloquei o echo antes do segundo foreach.

    // SEGUNDO FOREACH PARA BUSCAR AS IMAGENS
    // A VARIÁVEL $ItemIcone CONTÉM O XML CARREGADO
    foreach($itemIcone->data->item->weather->item->icon as $regs) {  

        $dataIcon = array();

        $dataIcon['api']['data']['item']['weather']['item']['icon'][] = array 
        (
            // LENDO OS NÓS
            'morning' => (string)$regs['morning'],
            'afternoon' => (string)$regs['afternoon'],
            'night' => (string)$regs['night'],
            'day' => (string)$regs['day'],

        );

        // ATRIBUINDO AS VARIÁVEIS  
        $IcoManha = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['morning'];
        $IcoTarde = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['afternoon'];
        $IcoNoite = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['night'];
        $IcoDia   = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['day'];                  

        echo " MANHA:" . $IcoManha . " TARDE: " . $IcoTarde . " NOITE: " . $IcoNoite . " DIA: " . $IcoDia . "";  // o echo fica dentro do foreach

    }

     <!-- restante do código -->

I did not take the test, but now, probably, it has released several records with repeated dates, right? You do not want this either.

SOLUTION (suggestion)

$dadosData = array(); // array que vamos usar para data
$dadosImg = array(); // array que vamos usar para iagens

// A VARIÁVEL $ItemIcone CONTÉM O XML CARREGADO
foreach($itemIcone->data->item->weather->item as $reg) {   

    // ZERANDO O ARRAY
    $data = array();

    // ÍCONES  
    $data['api']['data']['item']['weather']['item'][] = array 
    (
        // LENDO OS NÓS
        'date' => (string)$reg['date'],

    );

    $Data = $data['api']['data']['item']['weather']['item'][0]['date'];     

    $dadosData[] = "DATA: ". $Data; // aqui vão sendo inseridos os valores da data

    // SEGUNDO FOREACH PARA BUSCAR AS IMAGENS
    // A VARIÁVEL $ItemIcone CONTÉM O XML CARREGADO
    foreach($reg -> icon as $regs) {  

        $dataIcon = array();

        $dataIcon['api']['data']['item']['weather']['item']['icon'][] = array 
        (
            // LENDO OS NÓS
            'morning' => (string)$regs['morning'],
            'afternoon' => (string)$regs['afternoon'],
            'night' => (string)$regs['night'],
            'day' => (string)$regs['day'],

        );

        // ATRIBUINDO AS VARIÁVEIS  
        $IcoManha = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['morning'];
        $IcoTarde = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['afternoon'];
        $IcoNoite = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['night'];
        $IcoDia   = $dataIcon['api']['data']['item']['weather']['item']['icon'][0]['day'];                  

        $dadosImg[] = "MANHA:" . $IcoManha . " TARDE: " . $IcoTarde . " NOITE: " . $IcoNoite . " DIA: " . $IcoDia . "";  // insere os valores das imagens

    }

}

// loop para resgatar os valores

for($x = 0; $x < count($arrayData); $x++){

    echo $dadosData[$x].$dadosImg[$x]; // mostra todos os valores

}

Comments from Code: This code is inside the do loop, I set the value of the first foreach to the second and cast the values rescued in the arrays, then loop for out of foreach and print those variables. >     

02.05.2017 / 22:01