如何将下一个数组值放入当前键数组中?

4

什么是创建一个(无序索引)数组的最佳方法,使用下一个索引值到当前索引。我尝试使用next()但没有帮助。我的意思是:

Array
(
    [0] => a
    [8] => b
    [2] => c
    [7] => d
    [9] => e
    [11] => f
)

所以,我希望将这些数据作为以下形式的数组。
Array
(
    [0] => Array
    (
        [current] => a
        [next] => b
    )
    [8] => Array
    (
        [current] => b
        [next] => c
    )
    [2] => Array
    (
        [current] => c
        [next] => d
    )
    [7] => Array
    (
        [current] => d
        [next] => e
    )
    [9] => Array
    (
        [current] => e
        [next] => f
    )
    [11] => Array
    (
        [current] => f
        [next] => 
    )
)

什么是最快的方式来做到这一点?

3
foreach($arr as $k => $v) $arr[$k] = ["current" => $v, "next" => (isset($arr[$k+1]) ? $arr[$k+1]: "")];这段代码的作用是将数组 $arr 中的每一个元素拆分成当前元素和下一个元素,并将其组成一个新数组。这个操作可以通过引用实现,使得原数组同时得到更新。 - Rizier123
参考示例:https://3v4l.org/oba8T - Rizier123
2
如果您需要一个填充了下一个指针的数组,为什么不使用SPLDoublyLinkedList呢? - Mark Baker
@Naruto 我没明白。@Rizier123 的答案改变了数组键的顺序,与 OP 的问题不同,当 $k == 0 时,$k+1 会给你 1 而不是 8(实际上是下一个)。 - al'ein
我会尝试一下,看是否有帮助。 - al'ein
显示剩余2条评论
2个回答

2
注意:这个解决方案实际上是有效的,已经被证明。它因为某些模糊的原因而被投票反对。
我能想到的最简单的解决方案就是你在自己的问题中提出的那个,稍微改进一下(工作演示)。
<?php
// simulate the array
$arr = [0=>'a',8=>'b',2=>'c',7=>'d',9=>'e',11=>'f'];

// iterate it without messing with its internal pointer
for($i=0;$i<count($arr);$i++)
    $arr[key($arr)] = ["current" => current($arr), "next" => next($arr)];

// test it
echo '<pre>';
print_r($arr);

OUTPUT

Array
(
    [0] => Array
        (
            [current] => a
            [next] => b
        )

    [8] => Array
        (
            [current] => b
            [next] => c
        )

    [2] => Array
        (
            [current] => c
            [next] => d
        )

    [7] => Array
        (
            [current] => d
            [next] => e
        )

    [9] => Array
        (
            [current] => e
            [next] => f
        )

    [11] => Array
        (
            [current] => f
            [next] => 
        )

)

这个问题的目标是了解current()next()key()函数的确切用途,所以你只需要使用它们。

我写了同样的答案!你只需要复制它!! - Ali Akbar Azizi
@CooPer,我刚刚检查了两个版本,我的可以运行,你的不行 - al'ein
1
@CooPer 这不能是你答案的复制。这个有效,而且它不使用新数组来保存结果。 - RiggsFolly

-1

更新

对于无序数组

$newarray = array();
$length = count($oldarray);
for($i = 0; $i < $length ; ++$i)
{
   $newarray[] = array('current'=>current($oldarray),'next'=>next($oldarray));
}

3
在代码中使用 "@" 符号只能显示出编码者的无能。 - RiggsFolly
2
是的,但只是为了隐藏那些不应该被隐藏的错误,而这些错误也不应该出现在本来就不该写的代码中。 - RiggsFolly
2
@CooPer 你可以使用它来展示你无法解决代码问题,需要将它们掩盖过去。 - al'ein
1
继续努力,一般情况下没有使用 @ 和速度优先于准确性的充分理由。 - RiggsFolly
1
现在代码可以编译了,但是结果不正确。做个好孩子,取消 @AlanMachado 答案的恶意踩。你为什么问?因为他的代码可以编译并且产生了所需的结果。 - RiggsFolly
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接