Frage

Hier ist mein Prede ...

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

Und hier ist mein Code ...

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

Verwenden Sie das folgende Ergebnis ...

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

Das Problem ist, dass dies das genaue Ergebnis ist, das ich möchte, aber ich möchte nicht verwenden eval().

Als Eingabe in meinen Code habe ich eine Liste von keys und ein number. Das number sollte auf den Wert der festgelegt werden keys Array wird verwendet, um Kinderbasis zu generieren keys Für ein bestimmtes Array $array.

Gibt es eine andere Möglichkeit, dies zu erreichen? Ich möchte die Schlüssel/Zahlen nicht mit neuen Werten überschreiben, wenn der Code funktioniert - eval() Bewahrt dies bereits, daher sollte mein neuer Code dasselbe tun.

War es hilfreich?

Lösung

Hier ist ein vollständiges Code -Beispiel, das zeigt, wie es funktionieren würde. Wichtig ist, dass Sie einen Verweis auf das Array verwenden, damit Sie es ändern können:

<?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);
?>

Andere Tipps

Bitte beachten Sie, dass der folgende Code (den Sie bewerten) eine Warnung generieren und daher nicht an Projekten mit Fehlerberichten bis zum max.

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

Da Sie PHP 5 verwenden, können Sie mit Verweisen arbeiten, um Ihr Array zu manipulieren, während Sie den Zweig Ihres Baums durchqueren, den Sie ändern möchten.

$current = & $array;

foreach ($keys as $key):

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

  $current = & $current[$key];

endforeach;

$current = $value;

Bearbeiten: korrigiert, um Warnungen und Konflikte zu vermeiden.

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);

Ausgabe:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        int(10)
      }
    }
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top