重新排列 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')
事情是这样的,我有一个数组,我想按每第 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')