PHP如何以编程方式删除深键


PHP how to delete deep keys programmatically

假设您有一个像这样的深度数组:

<?php 
$array = ['hello' => ['deep' => 'treasure']];

然后你有一个键数组来访问字符串'treasure'

['hello', 'deep'];

如果直到运行时才知道数组的深度,如何删除字符串宝藏

编辑:

我很抱歉,我没有提供足够的信息来达到我想达到的目标

这里是一些代码,我想出了我需要的,但使用不安全的eval(请记住,目标目的地可能是一个数组,所以array_walk_recursive将不起作用)

function iterator_keys($iterator, $outer_data) {
  $keys = array();
  for ($i = 0; $i < $iterator->getDepth() + 1; $i++) {
    $sub_iterator = $iterator->getSubIterator($i);
    $keys[$i] = ($i == 0 && is_object($outer_data)
      || $i > 0 && is_object($last_iterator->current())) ?
    '->{"' . $sub_iterator->key() . '"}' :
    '["' . $sub_iterator->key() . '"]';
    $last_iterator = $sub_iterator;
  }
  return $keys;
}
function recursive_filter($data, callable $selector_function, $iterator = NULL) {
  $iterator = $iterator ?? new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data),
    RecursiveIteratorIterator::CHILD_FIRST
  );
  foreach ($iterator as $key => $value) {
    if ($selector_function($value, $key, $iterator)) {
      eval('unset($data' . implode('', iterator_keys($iterator, $data)) . ');');
    }
  }
  return $data;
}

的目的是要有一个深度数据结构一个对每个节点求值的函数如果它符合某个条件就把它从数据结构中移除,如果不用求值就能做到那就太棒了但目前我认为PHP无法通过编程方式删除深度超过一级的

你好,我想你想要的是这样的东西

<?php    
$array = ['hello' => ['deep' => ['deep1' => 'treasure']]];
$keys = ["hello", "deep", "deep1"];
function remove_recursive(&$array, $keys, $level = 0)
{
    if ($level >= count($keys)) {
        return $array;
    }
    if (isset($array[$keys[$level]]) && $level == count($keys) - 1) {
        unset($array[$keys[$level]]);
    } elseif (isset($array[$keys[$level]])) {
        $array[$keys[$level]] = remove_recursive($array[$keys[$level]], $keys, $level + 1);
    }
    return $array;
}
var_dump(remove_recursive($array, $keys));

你可以试试这个非常快速和肮脏的方法,使用eval来实现你的目标:

$array = ['hello' => ['deep' => 'treasure']];
$keys = ['hello', 'deep'];
$expression = 'unset($array[''' . implode('''][''', $keys) . ''']);';
eval($expression);

但也许你可以告诉我们更多关于你的开发,我们可以帮助你重新组织,以避免这个问题。

这将把目标数组元素设置为null。您还可以选择使用'':

$array = ['hello' => ['deep' => 'treasure']];
$path  = ['hello', 'deep'];
$temp = &$array;
foreach($path as $key) {
    $temp =& $temp[$key];
}
$temp = null;
print_r($array);

收益率:

Array
(
    [hello] => Array
        (
            [deep] =>
        )
)