9

我有这样的数组

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

无论如何使用字符串输入来取消设置 ['boo'] 值?

类似的东西

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

    // magic here

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

这个答案太棒了,它使我的脚本运行的第一部分使用字符串路径设置嵌套数组数据 。但无法逆转。PS eval() 不是一个选项:(

4

3 回答 3

12

由于您不能在引用的元素上调用 unset,因此您需要使用另一个技巧:

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

本质上,您遍历数组树,但保留对要从中删除节点的最后一个数组(倒数第二个节点)的引用。然后调用unset最后一个数组,将最后一个节点作为键传递。

检查此键盘

于 2013-05-22T18:13:12.663 回答
1

这与 Wouter Huysentruit 的相似。不同之处在于,如果您通过无效路径,它会返回 null。

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;
}
于 2014-12-19T17:46:08.757 回答
0

一些可能对你有用的东西:

$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);
}
于 2013-05-22T17:49:08.323 回答