将多维数组减少 1 的算法复杂度

algorithm complexity of reducing multidimensional array by 1

提问人:NulisDefo 提问时间:2/24/2020 最后编辑:NulisDefo 更新时间:3/8/2020 访问量:71

问:

示例数组(级别或成员的数量可能不同。

$dataset_groups = array(
    'first_level1_group' => array(
        array(
            'fname' => 'John', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ), 
    ),
    'second_level1_group' => array(
        array(
            'fname' => 'Adam', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ),
        array(
            'fname' => 'Jane', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pineapple'), 
        ), 
    ),
    'third_level1_group' => array(
        array(
            'fname' => 'Andrew', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pear'), 
        ),
        array(
            'fname' => 'Ross', 
            'lname' => 'Smith', 
            'favourite_fruit' => array('apple', 'pineapple'), 
        ), 
    ),
);

我想让它变成类似的东西(摆脱,等等)first_level1

$dataset_groups = array(
    array(
        'fname' => 'John', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ), 
    array(
        'fname' => 'Adam', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ),
    array(
        'fname' => 'Jane', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pineapple'), 
    ), 
    array(
        'fname' => 'Andrew', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pear'), 
    ),
    array(
        'fname' => 'Ross', 
        'lname' => 'Smith', 
        'favourite_fruit' => array('apple', 'pineapple'), 
    ), 
);

问题是像这样的东西

foreach ($dataset_groups as $group_key => $group) {

    if (empty($dataset)) {

        $dataset = $group;

    } else {

        $dataset = array_merge($dataset, $group);

    }

}

会更有效(我认为这应该是 O(n) 复杂性)还是这个(正如我在其中一个建议中发现的那样)?$dataset = call_user_func_array('array_merge', $dataset_groups);

由于我不知道它的内部运作方式,我很难确定(尽管我有一种感觉,它几乎是一样的)。call_user_func_array()

编辑1:基本上我想知道除了可读性之外,是否还有切换到的理由。call_user_func_array()

PHP 多维数组

评论

1赞 nice_dev 2/24/2020
看看你的输出,看起来就足够了。此外,对于这种情况,您不应该关心时间复杂性,因为您必须访问它们来调整它们。如果将它们添加到新数组中,则新数组必须容纳所有这些数组,这需要时间。如果取消设置密钥本身,也会重构数组,并花费大致相同的时间。array_values()
1赞 NulisDefo 2/24/2020
@vivek_23实际上不起作用,因为它将返回相同的结构数组,而不是将其转换为编号索引array_values()['first_level1']
0赞 nice_dev 2/24/2020
如果对当前输出数组执行 print_r() 操作,则它们也将具有数字索引。如果不是这种情况,你能在 3v4l.org 上分享一个演示吗?
0赞 nice_dev 2/24/2020
此外,仅仅通过简单的电话打电话没有任何好处。 当我们定义了函数或方法时使用。用它来调用 API 方法毫无意义。call_user_func_arrayarray_mergecall_user_func_array
1赞 nice_dev 2/25/2020
@NulisDefo 当前包含数据的数组位于另一个数组中。看了你的帖子,我才意识到你分享的数组不正确。因此,array_values() 不是一种选择。共享代码具有实际结构。使用 call_user_func_array 的优点只是有一种 1 行,而不是手动递归地向下挖掘。

答:

0赞 jspit 3/8/2020 #1

您还可以将 array_reduce() 与匿名函数一起使用,而不是 foreach 循环。

$newArray = array_reduce($dataset_groups, 
  function($carry, $item){
    return array_merge($carry,$item);
  }, []
);