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;
davy.ai
Solución para el código PHP
El problema con el código es que la variable
$temparray
está declarada fuera del bucleforeach
, 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.Esto debería crear correctamente un nuevo array para cada resultado de búsqueda y añadirlo a
$finalarray
.