重新排列 PHP 数组,将 1, 2, 3, 4, 5, 6, 7, 8, 9 重新排序为 1, 4, 7, 2, 5, 8, 3, 6, 9

Rearrange PHP Array, reorder 1, 2, 3, 4, 5, 6, 7, 8, 9 to 1, 4, 7, 2, 5, 8, 3, 6, 9

事情是这样的,我有一个数组,我想按每第 3 个项目重新排序。所以它是第 1、4、7,然后是第 2、5、8 和第 3、6、9。

来自这个:

$items = array('1','2','3','4','5','6','7','8','9');

对此:

$reordered_items = array('1','4','7','2','5','8','3','6','9');

或者也可以是3个独立的数组。像这样:

['1', '4', '7']
['2', '5', '8']
['3', '6', '9']

试过 array_chunk($items, count($items) / 3) 但它只是 returns 同一个数组分成 3 个相等的数组。

['1', '2', '3']
['4', '5', '6']
['7', '8', '9']

我不知道我是否应该使用 array_chunk 然后使用其他东西来实现我想要的。那么让我知道您对此有何看法。

更新:输入数组中不必正好是 9 个项目。它可以更短或更长,关键是它必须每第 3 个项目取一次,只要找到任何项目等等...

所以如果有 10 个项目:

$items = array('1','2','3','4','5','6','7','8','9','10');

输出应该是这样的:

$reordered_items = array('1','4','7','10','2','5','8','3','6','9');

谢谢!

我能想到的最简单的方法是遍历列表三次:

  • 从元素 0 开始,跳过 3,超过列表末尾时停止
  • 从元素 1 开始,跳过 3,超过列表末尾时停止
  • 从元素 2 开始,跳过 3,超过列表末尾时停止

使用 C-style for loop syntax:

可以轻松实现
$maxKey = count($items) - 1;
$rearrangedItems = [];
for ( $key=0; $key<=$maxKey; $key+=3 ) {
    $rearrangedItems[] = $items[$key];
}
for ( $key=1; $key<=$maxKey; $key+=3 ) {
    $rearrangedItems[] = $items[$key];
}
for ( $key=2; $key<=$maxKey; $key+=3 ) {
    $rearrangedItems[] = $items[$key];
}

如果您需要概括为不同的偏移量,您可以将整个内容放入外循环而不是复制和粘贴:

$offset = 3;
$maxKey = count($items) - 1;
$rearrangedItems = [];
for ( $start=0; $start<$offset; $start++ ) {
    for ( $key=$start; $key<=$maxKey; $key+=$offset ) {
        $rearrangedItems[] = $items[$key];
    }
}

试试这个

$items = array('1','2','3','4','5','6','7','8','9');
$tmp = [];
for ($i = 0; $i < count($items); $i++) {
    $tmp[$i%3][] = $items[$i];
}
$result = array_merge($tmp[0], $tmp[1], $tmp[2]);
print_r($result);

非常简单:

$items = array('1','2','3','4','5','6','7','8','9');

$items = array_chunk($items, 3); # Split into arrays of size 3
$items = array_map(null, ...$items); # Transpose the arrays
$items = array_merge(...$items); # Merge the arrays again

print_r($items);

试试这个,

$items = array('1','2','3','4','5','6','7','8','9');
$tmp = [];
for ($i = 0; $i < count($items); $i++) {
    $tmp[$i%3][] = $items[$i];
}
$result = call_user_func_array('array_merge', $tmp);
dd($result);

输出:

array('1','4','7','2','5','8','3','6','9')