Pregunta

Aquí está mi precodifo ...

$keys = array('a', 'b', 'c', 'd');
$number = 10;

Y aquí está mi código ...

eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;');

Usando esto, obtengo el siguiente resultado ...

Array (
    [a] => Array
        (
            [b] => Array
                (
                    [c] => Array
                        (
                            [d] => 10
                        )
                )
        )
)

Ahora, el problema es que este es el resultado exacto que quiero, pero no quiero usar eval().

Como entrada en mi código, tengo una lista de keys y un number. los number debe establecerse en el valor del keys la matriz que se utiliza para generar niños keys para una determinada matriz $array.

¿Hay alguna forma diferente de que pueda lograr esto? No quiero sobrescribir las claves/números con nuevos valores como funciona el código - eval() ya conserva esto, por lo que mi nuevo código debería hacer lo mismo.

¿Fue útil?

Solución

Aquí hay un ejemplo de código completo que muestra cómo funcionaría. Lo importante es que use una referencia a la matriz para que pueda modificarla:

<?php
    $keys = array('a', 'b', 'c', 'd'); 
    $number = 10;

    $org_array = array(
        "a" => "string",
        "z" => array( "k" => false)
      );

    function write_to_array(&$array, $keys, $number){
      $key = array_shift($keys);
      if(!is_array($array[$key])) $array[$key] = array();
      if(!empty($keys)){
        write_to_array($array[$key], $keys, $number);
      } else {
        $array[$key] = $number;
      }
    }

    write_to_array($org_array, $keys, $number);

    print_r($org_array);
?>

Otros consejos

Tenga en cuenta que el siguiente código (que evalúa) generará una advertencia y, por lo tanto, no funcionará en proyectos con errores informando al máximo:

$array = array();
$array['a']['b'] = 42; // $array['a'] is not an array... yet

Como está utilizando PHP 5, puede trabajar con referencias para manipular su matriz mientras atraviesa la rama de su árbol que desea modificar.

$current = & $array;

foreach ($keys as $key):

  if (!isset($current[$key]) || !is_array($current[$key]))
    $current[$key] = array();

  $current = & $current[$key];

endforeach;

$current = $value;

Editar: corregido para evitar advertencias y conflictos.

function deepmagic($levels, $value)
{
    if(count($levels) > 0)
    {
        return array($levels[0] => deepmagic(array_slice($levels, 1),
            $value));
    }
    else
    {
        return $value;
    }
}

$a = deepmagic(Array('a', 'b', 'c', 'd'), 10);

var_dump($a);

Producción:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        int(10)
      }
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top