es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bucle foreach anidado devuelve SOLAMENTE el último elemento del arreglo

Esta función toma un array de cadenas. Para cada cadena, busca en un documento xml y devuelve un array. Incopora todos los arrays encontrados en un array separado llamado $finalarray.
Estoy intentando almacenar los resultados de búsqueda del archivo sample.xml en el array $finalarray. Por alguna razón, siempre almacena el resultado de búsqueda del último elemento (el valor 3, ‘c’). También intenté con un bucle for sin éxito. Por alguna razón, la consulta de xpath se reinicia y se aplica al último elemento.

// array para capturar el resultado de búsqueda xml
$sampleflightdataxml = simplexml_load_file('sample.xml');
$flightList = ['a', 'b', 'c'];

$temparray = [];
$finalarray = [];
$xmlres = [];

foreach ($flightList as $flight) {
  $xmlres = $sampleflightdataxml->xpath("//flights/FlightOrigin[contains(text(), '{$flight}')]/ancestor::flights | //flights//FlightDest[contains(text(), '{$flight}')]/ancestor::flight");
  if (count($xmlres) > 0) { // si se encuentra información de vuelo
    foreach ($xmlres as $key => $val) {
      $temparray[$key]['FlightOrigin'] = (string)$val->FlightOrigin;
      $temparray[$key]['FlightDest'] = (string)$val->FlightDest;
    }
    $finalarray[] = $temparray;

  }

}
return $finalarray;
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para el código PHP

    El problema con el código es que la variable $temparray está declarada fuera del bucle foreach, por lo que no se borra entre iteraciones y se está añadiendo el mismo array a $finalarray en cada iteración. Para solucionarlo, mueve la declaración de $temparray dentro del bucle, de modo que se cree un nuevo array en cada iteración.

    // array para capturar los resultados de búsqueda en XML
    $sampleflightdataxml = simplexml_load_file('muestra.xml');
    $flightList = ['a', 'b', 'c'];
    
    $finalarray = [];
    
    foreach ($flightList as $flight) {
      $temparray = [];  // mueve la declaración dentro del bucle
      $xmlres = $sampleflightdataxml->xpath("//flights/FlightOrigin[contains(text(), '{$flight}')]/ancestor::flights | //flights//FlightDest[contains(text(), '{$flight}')]/ancestor::flight");
      if (count($xmlres) > 0) { // si se encuentran datos de vuelo
        foreach ($xmlres as $key => $val) {
          $temparray[$key]['FlightOrigin'] = (string)$val->FlightOrigin;
          $temparray[$key]['FlightDest'] = (string)$val->FlightDest;
        }
        $finalarray[] = $temparray;
      }
    }
    
    return $finalarray;
    

    Esto debería crear correctamente un nuevo array para cada resultado de búsqueda y añadirlo a $finalarray.

Comments are closed.