Cómo generar la ruta de un arreglo para una clave específica mediante un bucle a través de un arreglo multidimensional dinámico.
Tengo una matriz multidimensional dinámica como se muestra a continuación:
$cityList = [
'AUS' => [
'VIC' => [
'population' => ['total' => '5M'],
'Richmond' => [
'population' => ['total' => '0.15M']
]
],
'NSW' => [
'Carlton' => [
'population' => ['total' => '8M']
]
]
]
];
Aquí, la columna “población” puede o no estar presente en todas las dimensiones. Sin embargo, si está presente, siempre tendrá “total” como submatriz como se muestra arriba.
Ahora, necesito recorrer la matriz y generar todas las rutas a la población si existe.
He escrito el código de la siguiente manera:
public function fetchAllPopulation(array $cityList, $path = '', &$cityWithPopulation)
{
foreach ($cityList as $key => $city) {
if (is_array($city) && $key != 'population') {
$path .= $path == '' ? $key: "##$key";
$this->fetchAllPopulation($city, $path, $cityWithPopulation);
} else {
$population = $city['total'];
$cityWithPopulation[$path] = $population;
}
}
return $assetWithPathsAndIds;
}
Salida esperada:
[
'AUS##VIC' => '5M',
'AUS##VIC##Richmond' => '0.15M',
'AUS##NSW##Carlton' => '8M'
]
Salida actual:
[
'AUS##VIC' => '5M',
'AUS##VIC##Richmond' => '0.15M',
'AUS##VIC##NSW##Carlton' => '8M' // esto es incorrecto
]
El problema es que si alguna columna tiene más de 2 dimensiones, entonces la clave anterior se agregará a la siguiente como se muestra arriba.
Cualquier comentario o corrección a mi código será apreciado. ¡Gracias!
davy.ai
El problema con la implementación actual es que
$path
se está agregando con la clave anterior en cada iteración del bucleforeach
, lo que resulta en una generación incorrecta de la ruta cuando el arreglo tiene más de 2 dimensiones.Para solucionar esto, necesitamos pasar la variable
$path
actualizada a la llamada recursiva de la función, para que capture correctamente la ruta en cada nivel. Podemos lograr esto pasando una copia de$path
en cada llamada recursiva.Código actualizado:
Con esta actualización, la función devolverá la salida esperada: