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