Dinamik PHP bir ilişkisel diziye ekleme / oluşturma

2 Cevap php

Ben dinamik PHP ilişkilendirilebilir bir dizi oluşturmak için çalışıyor ve oldukça benim strateji hakkı almıyorum. Temelde, örneğin, dizi yapısında belli bir derinlikte bir değer eklemek istiyorum:

$array['first']['second']['third'] = $val;

Şimdi, şey, ben o derinliği varsa emin değilim, ve eğer değilse, ben her seviye için anahtarları (ve diziler) oluşturmak istiyorsanız, ve nihayet doğru seviyede değer eklemek olduğunu.

Benim kod bu oldukça çok yapıyorum, ben "array_key_exists" bir sürü yapmanın yorgun büyüdü, bu yüzden seviyesi tuşlarının listesi verilen benim için dizi oluşturur bir işlevi yapmak istedim. Bunun için iyi bir strateji üzerinde herhangi bir yardım takdir edilmektedir. Ben sadece bunu almıyorum, oldukça basit bir yolu var eminim ...

2 Cevap

sadece bu yüzden bunu yaparsanız php seni suçlamak değil

$array['first']['second']['third'] = $val;
print_r($array);

Eğer anahtarlar sabit kodlanmış olmak istemiyorsanız, burada esnek bir çözüm

/// locate or create element by $path and set its value to $value
/// $path is either an array of keys, or a delimited string
function array_set(&$a, $path, $value) {
    if(!is_array($path))
        $path = explode($path[0], substr($path, 1));
    $key = array_pop($path);
    foreach($path as $k) {
        if(!isset($a[$k]))
            $a[$k] = array();
        $a = &$a[$k];
    }
    $a[$key ? $key : count($a)] = $value;
}

// example:
$x = array();

array_set($x, "/foo/bar/baz", 123);
array_set($x, "/foo/bar/quux", 456);
array_set($x, array('foo', 'bah'), 789);

Gibi bir işlevi oluşturun:

function insert_into(&$array, array $keys, $value) {
     $last = array_pop($keys);       

     foreach($keys as $key) {
          if(!array_key_exists($key, $array) || 
              array_key_exists($key, $array) && !is_array($array[$key])) {
                  $array[$key] = array();

          }
          $array = &$array[$key];
     }
     $array[$last] = $value;
}

Kullanımı:

$a = array();
insert_into($a, array('a', 'b', 'c'), 1);
print_r($a);

Çıkışı:

Array
(
    [a] => Array
        (
            [b] => Array
                (
                    [c] => 1
                )

        )

)