【问题标题】:algorithm complexity of reducing multidimensional array by 1多维数组减1的算法复杂度
【发布时间】:2020-02-24 11:54:00
【问题描述】:

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

$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() 的内部运作方式,我很难确定(尽管我感觉它几乎相同)。

EDIT1:基本上我想知道除了可读性之外是否还有理由切换到call_user_func_array()

【问题讨论】:

  • 看看你的输出,array_values() 看起来足够了。此外,对于这种情况,您不应该关心时间复杂度,因为您必须访问它们来调整它们。如果将它们添加到新阵列中,新阵列将不得不容纳所有这些,这需要时间。如果您取消设置密钥本身,这也将重组数组并花费大致相同的时间。
  • @vivek_23 array_values() 不会真正起作用,因为它会返回相同的结构数组,除了 ['first_level1'] 它会将其转换为编号索引
  • 如果你对它们执行 print_r(),你当前的输出数组也会有数字索引。如果不是这样,您可以在3v4l.org 上分享一个演示吗?
  • 另外,与简单的array_merge 调用相比,调用call_user_func_array 并没有任何优势。当我们定义了函数或方法时使用call_user_func_array。用它调用 API 方法没有意义。
  • @NulisDefo 您当前包含数据的数组在另一个数组中。看了你的帖子,我才意识到你分享的数组是不正确的。因此,array_values() 不是一个选项。您的共享代码具有实际结构。使用 call_user_func_array 的好处只是有一种 1-liner 而不是手动递归地挖掘。

标签: php arrays multidimensional-array


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多