dinamik dizi anahtar eklemeler

3 Cevap php

İşte benim precode olduğunu ...

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

Ve burada benim kod ...

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

Bunu kullanarak, ben şu sonucu elde ...

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

Şimdi sorun bu istediğim kesin sonuç olduğunu, ama ben kullanmak istemiyorum eval().

Kodumu girdi olarak, ben keys bir listesini ve bir number var. number, belirli bir dizi için çocuk tabanlı üretmek için kullanılan keys dizi keys değerine ayarlanmalıdır $array.

Ben bu elde edebilirsiniz farklı bir yolu var mı? eval() bu yüzden benim yeni kod aynısını yapması gerektiğini, zaten bu korur - Ben kod çalışır gibi yeni değerlerle tuşları / numaralarını üzerine yazmak istemiyorum.

3 Cevap

İşte nasıl çalışır gösteren tam bir kod örneği. Nedir önemlidir bunu değiştirebilirsiniz böylece diziye bir başvuru kullanmak olduğunu:

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

(Eğer değerlendirmek olan) Aşağıdaki kod bir uyarı oluşturur unutmayın ve bu nedenle hata max raporlama ile projeler üzerinde çalışmaz Lütfen:

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

Eğer PHP 5 kullanıyorsanız bu yana, değiştirmek istediğiniz senin ağacın dalını geçme sırasında dizi işlemek için referansları ile çalışabilirsiniz.

$current = & $array;

foreach ($keys as $key):

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

  $current = & $current[$key];

endforeach;

$current = $value;

Edit: uyarı ve çatışmaları önlemek için düzeltildi.

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

Çıktı:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        int(10)
      }
    }
  }
}