4

假设我有两个数组:

$a1 = array(0, 1, 2);
$a2 = array(3, 4, 5);

我希望能够做一种交替数组值的合并技术,而不仅仅是连接它们。我想要这个结果:

array(0, 3, 1, 4, 2, 5);

有没有一种本地方法可以做到这一点,因为这里的性能是一个问题,因为我需要这样做数千次

请注意,我知道我可以这样做:

for (var $i = 0; $i < count($a1); $i++) {
    newArray[] = $a1[$i];
    newArray[] = $b1[$i];
}

如果有更快的方法,我正在寻找一种内置方法。

4

2 回答 2

10
$count = count($a1);
for ($i = 0; $i < $count; $i++) {
    $newArray[] = $a1[$i];
    $newArray[] = $b1[$i];
}

我在这里的工作已经完成了。

$a1 = array(0,1,2);
$a2 = array(3,4,5);

$start = microtime(TRUE);

for($t = 0; $t < 100000; $t++)
{
    $newArray = array();
    $count = count($a1);
    for ($i = 0; $i < $count; $i++)
    {
        $newArray[] = $a1[$i];
        $newArray[] = $a2[$i];
    }
}
echo  round(microtime(TRUE) - $start, 2); # 0.6

$a1 = array(0,1,2);
$a2 = array(3,4,5);

$start = microtime(TRUE);

for($t = 0; $t < 100000; $t++)
{
    $newArray = array();
    for ($i = 0; $i < count($a1); $i++)
    {
        $newArray[] = $a1[$i];
        $newArray[] = $a2[$i];
    }
}
echo  round(microtime(TRUE) - $start, 2); # 0.85

因此,预先计算数组大小将是 ~1/4 [需要引用](在该死的 100.000 次迭代中,您总共将获得 0.2)更快。如果你把count()循环放在里面,它会重新计算每个iteration. 1/4 在我看来相当快。如果你正在寻找编译函数,你可以停下来。

PS Benchmark 就像比基尼一样,它向您展示一切,但什么也没有。

于 2012-08-06T11:44:40.883 回答
0

由于您正在“压缩”两个索引数组,因此您可以“转置和展平”。我希望这不会像使用for()or那样快foreach(),但是在小型输入数组上,性能不会有明显的拖累。换句话说,当寻求编码风格或最小声明变量时,应考虑以下技术。

代码:(演示

$a1 = [0, 1, 2];
$a2 = [3, 4, 5];

var_export(
    array_merge(...array_map(null, $a1, $a2))
);

输出:

array (
  0 => 0,
  1 => 3,
  2 => 1,
  3 => 4,
  4 => 2,
  5 => 5,
)

作为一种时髦的无函数方法,您可以$a1foreach()值声明中推送值,在循环体内,您可以推送$a2值。大饱眼福...(演示

$result = [];
foreach ($a1 as $index => $result[]) {
    $result[] = $a2[$index];
}
var_export($result);
// same output as earlier snippet

对于任何正在寻找关联安全技术的人,您可以进行循环切片或拼接调用。请注意,这splice()将在过程中改变/消耗输入数组。(切片演示) (拼接演示)

$result = [];
for ($i = 0, $count = count($a1); $i < $count; ++$i) {
    $result += array_slice($a1, $i, 1)
        + array_slice($a2, $i, 1);
}

或者

$result = [];
while($a1 && $a2) {
    $result += array_splice($a1, 0, 1)
        + array_splice($a2, 0, 1);
}
于 2021-09-09T08:36:48.190 回答