【发布时间】: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