将PHP中的多维数组修剪/缩减到一定深度

将PHP中的多维数组修剪/缩减到一定深度,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我断断续续地找了几年都没找到。偶尔,我想把多维度删减到一定的深度。这在存储大型递归数据集时非常有用,因为您只需要一定深度的数据,其余的数据应该丢弃 例如,给定以下数组: $arr = array( '1' => array( '1.1' => '1.1.1'), '2', '3' => array( '3.1' => array( '3.1.1' => '3.1.1.1') )

我断断续续地找了几年都没找到。偶尔,我想把多维度删减到一定的深度。这在存储大型递归数据集时非常有用,因为您只需要一定深度的数据,其余的数据应该丢弃

例如,给定以下数组:

  $arr = array(
    '1' => array(
      '1.1' => '1.1.1'),
    '2', 
    '3' => array(
      '3.1' => array(
        '3.1.1' => '3.1.1.1')
       )
     );
我想把它修剪回x个维度,称之为:

某些修剪方法($arr数组,$dimensions整数)

…并希望返回类似以下内容的数据:

print\r(一些修剪方法($arr,1))

print\r(一些修剪方法($arr,2))

print\r(一些修剪方法($arr,3))

我可以考虑如何手动使用回调来迭代数组,但这太慢了。理想情况下,这需要在不遍历整个数组的情况下完成


也许我错过了一个简单的方法

我想这就是你想要的。主要的概念是一种递归方法,用于复制跟踪深度的输入数组。每次返回时,它都会从深度中减去1,在检查是否需要调用递归循环之前,它会检查深度是否允许。如果不是,那么它只是将键添加到输出循环中

$arr = array(
    '1' => array(
        '1.1' => '1.1.1'),
    '2',
    '3' => array(
        '3.1' => array(
            '3.1.1' => '3.1.1.1')
    )
);

function some_prune_method ( $array, $depth )   {
    $output = [];
    foreach ( $array as $key => $element )  {
        if ( is_array($element))  {
            if ( $depth > 1 )   {
                $output [$key] = some_prune_method ( $element, $depth-1 );
            }
            else    {
                $output[] = $key;
            }
        }
        else    {
            $output[] = $element;
        }
    }

    return $output;
}
print_r(some_prune_method($arr, 2));

Array
(
    [1] => Array
        (
            [0] => 1.1.1
        )

    [2] => 2
    [3] => Array
        (
            [0] => 3.1
        )

)

你能告诉我们你采取了什么样的方法并且结果很慢吗?为什么不递归呢?也太慢了?@dWinder recursive总是很慢。没有递归算法不能通过重写而加速。无论如何,如果您的输入不包含混合键和值,即此处
['1'=>[…],'2']
深度为1,则需要第一项的键和第二项的值。如果您的输入看起来像这样:
['1'=>[…],'2'=>[]]
,那么就需要找出在哪个级别调用数组键。但是,既然你混合了它,你就必须不断检查你有什么。无论如何,如果要减少整个数组,必须以这种或那种方式遍历整个数组。
  Array( 
    [
      '1' => ['1.1'], 
      '2', 
      '3' => ['3.1' => '3.1.1']
    ]
  )
$arr = array(
    '1' => array(
        '1.1' => '1.1.1'),
    '2',
    '3' => array(
        '3.1' => array(
            '3.1.1' => '3.1.1.1')
    )
);

function some_prune_method ( $array, $depth )   {
    $output = [];
    foreach ( $array as $key => $element )  {
        if ( is_array($element))  {
            if ( $depth > 1 )   {
                $output [$key] = some_prune_method ( $element, $depth-1 );
            }
            else    {
                $output[] = $key;
            }
        }
        else    {
            $output[] = $element;
        }
    }

    return $output;
}
print_r(some_prune_method($arr, 2));
Array
(
    [1] => Array
        (
            [0] => 1.1.1
        )

    [2] => 2
    [3] => Array
        (
            [0] => 3.1
        )

)