2013-05-22 25 views
6

gelen eleman silmek için dize yolunu kullanarak bunudiziden

$arr = [ 
    'baz' => [ 
     'foo' => [ 
     'boo' => 'whatever' 
    ] 
    ] 
]; 

gibi dizi dize girişini kullanarak değeri [ 'boo'] unset için yine de var mı var? O

$str = 'baz->foo->boo'; 
    function array_unset($str, $arr) { 

    // magic here 

    unset($arr['baz']['foo']['boo']); 
    return $arr; 
    } 

Bu cevap gibi

şey harika oldu ve bu Using a string path to set nested array data çalıştırmak Senaryomun ilk bölümü yapılmış. Ama tersine çeviremez. P.S. Eğer bir referans elemanı üzerinde tanımsız çağrı yapamazsınız yana

$str = 'bar,foo,boo'; 

function array_unset($str,&$arr) { 
    $path = explode(',',$str); 
    $buf = $arr; 
    for($i=0;$i<count($path)-1;$i++) { 
    $buf = &$buf[$path[$i]]; 
    } 

    unset($buf); 
} 

cevap

9

, başka hile kullanmak gerekir: eval() Bir seçenek :(sizin için işe yarayabilecek anında

+0

Lanet ... zeki. Btw 2 soru var. 1) neden bölme kullanıyorsunuz? basit patlayabilir iş tamamen iyi. 2) neden referans olarak $ arg argüman koydunuz? – remtsoy

+1

1) son haftalarda Qt/C# 'yı kullanarak,' split 'kullanma eğilimindeyken patlayabilir, sadece iyi idd çalışacaktır. 2) her zaman orijinal diziye bir referans tutmak gerekir, aksi halde unset sadece düğümü orijinal dizinin yerine kopyadan kaldıracaktır. –

+0

Parametrede geçirilen dizi değişkeninin isminiz varsa $ GLOBALS kullanabilirsiniz. (doc'dan: _to unset() bir fonksiyonun içindeki global bir değişkeni, sonra $ GLOBALS dizisini kullanarak do_) – antoox

0

şey değildir

özünde
function array_unset($str, &$arr) 
{ 
    $nodes = split("->", $str); 
    $prevEl = NULL; 
    $el = &$arr; 
    foreach ($nodes as &$node) 
    { 
     $prevEl = &$el; 
     $el = &$el[$node]; 
    } 
    if ($prevEl !== NULL) 
     unset($prevEl[$node]); 
    return $arr; 
} 

$str = "baz->foo->boo"; 
array_unset($str, $arr); 

, dün düğümü olarak geçen Sonra geçen dizi unset diyoruz. dizi ağaç travers ancak düğüm silmek istediğiniz son dizisi (sondan bir önceki düğüm), bir başvuru tutmak Bir anahtar:

Check this codepad

+0

Çalışmıyor. [Belgeler] 'den (http://fr2.php.net/manual/en/function.unset.php): _SAYFAK TARAFINDAN SEÇİLEN bir değişken, bir fonksiyonun içinde tanımlanmamışsa(), sadece yerel değişken yok edilir. . Çağıran ortamdaki değişken, unset() işlevinden önce – antoox

+0

Nope ... ile aynı değeri korur. $ Arr'ın kendisini etkilemez. – remtsoy

1

Bu, Wouter Huysentruit'in benzerine benzer. Fark, geçersiz bir yoldan geçerseniz null döndürmesidir.

function array_unset(&$array, $path) 
{ 
    $pieces = explode('.', $path); 
    $i = 0; 
    while($i < count($pieces)-1) { 
     $piece = $pieces[$i]; 
     if (!is_array($array) || !array_key_exists($piece, $array)) { 
      return null; 
     } 
     $array = &$array[$piece]; 
     $i++; 
    } 
    $piece = end($pieces); 
    unset($array[$piece]); 
    return $array; 
}