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.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que $path se está agregando con la clave anterior en cada iteración del bucle foreach, 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:

    public function fetchAllPopulation(array $cityList, $path = '', &$cityWithPopulation)
    {
        foreach ($cityList as $key => $city) {
            if (is_array($city) && $key != 'population') {
                $subPath = $path == '' ? $key : "$path##$key"; // crear una copia de $path
                $this->fetchAllPopulation($city, $subPath, $cityWithPopulation);
            } else {
                $population = $city['total'];
                $cityWithPopulation[$path] = $population;
            }
        }
        return $cityWithPopulation;
    }
    

    Con esta actualización, la función devolverá la salida esperada:

    [
      'AUS##VIC' => '5M',
      'AUS##VIC##Richmond' => '0.15M',
      'AUS##NSW##Carlton' => '8M'
    ]
    

Comments are closed.