Php 递归地重新排序数组键--数组\u切片慢吗?

Php 递归地重新排序数组键--数组\u切片慢吗?,php,arrays,key,Php,Arrays,Key,我编写了一个方法来对数组中的所有数字键重新排序 您可以在下面的代码中看到,我有一个带有未排序键的数组。 该键(f.e.200,2)应递归地重新排序(f.e.0,1)。 这应该可以在PHP5.6到PHP7中使用,但至少可以在PHP7中使用 完美的工作,但似乎非常缓慢。 我想知道是否有人知道如何加快速度 代码和测试: function reorderKeysRecursively(array $array) { foreach ($array as $key => &$valu

我编写了一个方法来对数组中的所有数字键重新排序

您可以在下面的代码中看到,我有一个带有未排序键的数组。 该键(f.e.200,2)应递归地重新排序(f.e.0,1)。 这应该可以在PHP5.6到PHP7中使用,但至少可以在PHP7中使用

完美的工作,但似乎非常缓慢。 我想知道是否有人知道如何加快速度

代码和测试:

function reorderKeysRecursively(array $array)
{
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            $array[$key] = reorderKeysRecursively($value);
        }
    }
    return array_slice($array, 0);
}

$array = [
    2 => [
        'foo' => 'bar',
        2     => 'baz',
        'bar' => 3,
        33    => [
            55 => [
                2 => [
                    55 => [
                        'foo' => 'bar'
                    ],
                ],
            ],
        ],
        'baz' => 4,
    ],
];

$start = microtime(true);
for ($i = 0; $i < 200000; $i++) {
    reorderKeysRecursively($array);
}
echo "elapsed: " . (microtime(true) - $start) . PHP_EOL;

$expect = json_encode(
    [
        0 => [
            'foo' => 'bar',
            0     => 'baz',
            'bar' => 3,
            1     => [
                0 => [
                    0 => [
                        0 => [
                            'foo' => 'bar',
                        ],
                    ],
                ],
            ],
            'baz' => 4,
        ],
    ]
);
$result = json_encode(reorderKeysRecursively($array));
echo "is expected result: " . (var_export($result === $expect, true)) . PHP_EOL;
函数递归地重新排序(array$array)
{
foreach($key=>&$value作为数组){
if(是_数组($value)){
$array[$key]=递归地重新排序键($value);
}
}
返回数组\u切片($array,0);
}
$array=[
2 => [
‘foo’=>‘bar’,
2=>“baz”,
'bar'=>3,
33    => [
55 => [
2 => [
55 => [
“foo”=>“bar”
],
],
],
],
‘baz’=>4,
],
];
$start=microtime(真);
对于($i=0;$i<200000;$i++){
递归地重新排序($array);
}
回声“消失:”。(微时间(true)-$start)。PHP_EOL;
$expect=json_encode(
[
0 => [
‘foo’=>‘bar’,
0=>“baz”,
'bar'=>3,
1     => [
0 => [
0 => [
0 => [
‘foo’=>‘bar’,
],
],
],
],
‘baz’=>4,
],
]
);
$result=json_encode(递归地重新排序($array));
echo“是预期结果:”。(变量导出($result==$expect,true))。PHP_EOL;
谢谢你的帮助! /Cotton

还有很长的路要走(直到有人找到更好的解决方案) 在每个数组级别上都是
数组\u merge

function reorderKeysRecursively(array &$array)
{
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            $array[$key] = reorderKeysRecursively($value);
        }
    }
    return array_merge($array);
}
出去


调用
array\u slice()
有什么意义?该函数用于获取数组的一部分,而您不需要这样做。一般来说,递归算法速度较慢。使用迭代器方法更快,但实现起来更复杂。最好的选择可能是使用php内置的递归数组排序函数之一,因为这些函数根据定义更有效(无需解释)。我使用
array\u slice
,只是因为此函数可以重新排序所有数字键。事实上,这就是我想要的:另一种重新排序的方式/功能。编辑:但仅限于数字键。其他(字符串)必须保持原样。我可能会找到解决方案:
array\u merge($array)
应该完成这项工作。我马上就要考试了@见@mickmackusa我希望sombody有更好的解决方案。但我认为
array\u merge
是一种方法,因为它完全满足了我的需要:对数字键重新排序,剩下的就不用管了。我发布了一个答案。要获得更快的解决方案,请不要通过引用传递
$value
。它会减慢速度,在这种情况下是不必要的。是的,我忘记了。谢谢
[
    0 => [                  // before: 2
        'foo' => 'bar',
        0     => 'baz',     // before: 2
        'bar' => 3,
        1     => [          // before: 33
            0 => [          // before: 55
                0 => [      // before: 2
                    0 => [  // before: 55
                        'foo' => 'bar',
                    ],
                ],
            ],
        ],
        'baz' => 4,
    ],
]