在多个数组中拆分数组按 PHP 中的顺序填充
Split array in multiple arrays populate by order in PHP
数组输入:
$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');
期望的输出(例如 4 个数组):
Array(
'a',
'e'
)
Array(
'b',
'f'
)
Array(
'c',
'g'
)
Array(
'd',
'h'
)
如您所见,它的输出 与 array_chunk 不同。我想一个接一个地填充不同的数组,当到达最后一个数组时返回到第一个数组并重复直到没有更多值。
我尝试了很多可能性,但找不到好的。
您可以迭代您的值并使用模数填充数组:
$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');
$arrs = [];
$key = 0;
foreach ($input_array as $val) {
$arrs[$key++ % 4][] = $val;
}
// $arrs contains what you want.
// Then you could extract them in separate arrays.
list($a1, $a2, $a3, $a4) = $arrs;
var_dump($a1, $a2, $a3, $a4);
输出:
array(2) {
[0]=> string(1) "a"
[1]=> string(1) "e"
}
array(2) {
[0]=> string(1) "b"
[1]=> string(1) "f"
}
array(2) {
[0]=> string(1) "c"
[1]=> string(1) "g"
}
array(2) {
[0]=> string(1) "d"
[1]=> string(1) "h"
}
$a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
for($i = 0, $res = []; $i < $l = count($a); $res[$i % 4] = [$a[($i + 4) % $l], $a[$i]], $i++);
print_r($res);
遍历索引,增加你想要的输出数组的数量。然后使用内部循环获取各个元素。
$len = count($input_array);
$output_array = [[], [], [], []];
$stride = count($output_array);
for ($i = 0; $i < $len; $i += $stride) {
for ($j = 0; $j < $stride && $i + $j < $len; $j++) {
$output_array[$j][] = $input_array[$i + $j];
}
}
一行代码不一定有利于可读性,而且这需要解释的事实意味着它不是需要维护的代码的好答案,但是
$result = array_map(null, ...array_chunk($input_array, count($input_array) / 2));
第一部分将输入数组分块,不使用 2 - 这将给出一个包含 2 列数据的数组 - 而是给出 2 行数据,因此初始输入将转换为
array(2) {
[0]=>
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
}
[1]=>
array(4) {
[0]=>
string(1) "e"
[1]=>
string(1) "f"
[2]=>
string(1) "g"
[3]=>
string(1) "h"
}
}
PHP 中的 ...
运算符也将参数数组传递给函数,就好像它们是单独的参数一样,因此有效地将数组块中的两行作为单独的数组参数传递。
使用 null
回调调用 array_map()
执行数组参数的“转置”,如 示例 #4 所述PHP Docs for the function中的,它将示例中的2x4数组转换为4x2数组,给出
array(4) {
[0]=>
array(2) {
[0]=>
string(1) "a"
[1]=>
string(1) "e"
}
[1]=>
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "f"
}
[2]=>
array(2) {
[0]=>
string(1) "c"
[1]=>
string(1) "g"
}
[3]=>
array(2) {
[0]=>
string(1) "d"
[1]=>
string(1) "h"
}
}
数组输入:
$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');
期望的输出(例如 4 个数组):
Array(
'a',
'e'
)
Array(
'b',
'f'
)
Array(
'c',
'g'
)
Array(
'd',
'h'
)
如您所见,它的输出 与 array_chunk 不同。我想一个接一个地填充不同的数组,当到达最后一个数组时返回到第一个数组并重复直到没有更多值。
我尝试了很多可能性,但找不到好的。
您可以迭代您的值并使用模数填充数组:
$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');
$arrs = [];
$key = 0;
foreach ($input_array as $val) {
$arrs[$key++ % 4][] = $val;
}
// $arrs contains what you want.
// Then you could extract them in separate arrays.
list($a1, $a2, $a3, $a4) = $arrs;
var_dump($a1, $a2, $a3, $a4);
输出:
array(2) {
[0]=> string(1) "a"
[1]=> string(1) "e"
}
array(2) {
[0]=> string(1) "b"
[1]=> string(1) "f"
}
array(2) {
[0]=> string(1) "c"
[1]=> string(1) "g"
}
array(2) {
[0]=> string(1) "d"
[1]=> string(1) "h"
}
$a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
for($i = 0, $res = []; $i < $l = count($a); $res[$i % 4] = [$a[($i + 4) % $l], $a[$i]], $i++);
print_r($res);
遍历索引,增加你想要的输出数组的数量。然后使用内部循环获取各个元素。
$len = count($input_array);
$output_array = [[], [], [], []];
$stride = count($output_array);
for ($i = 0; $i < $len; $i += $stride) {
for ($j = 0; $j < $stride && $i + $j < $len; $j++) {
$output_array[$j][] = $input_array[$i + $j];
}
}
一行代码不一定有利于可读性,而且这需要解释的事实意味着它不是需要维护的代码的好答案,但是
$result = array_map(null, ...array_chunk($input_array, count($input_array) / 2));
第一部分将输入数组分块,不使用 2 - 这将给出一个包含 2 列数据的数组 - 而是给出 2 行数据,因此初始输入将转换为
array(2) {
[0]=>
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
}
[1]=>
array(4) {
[0]=>
string(1) "e"
[1]=>
string(1) "f"
[2]=>
string(1) "g"
[3]=>
string(1) "h"
}
}
PHP 中的 ...
运算符也将参数数组传递给函数,就好像它们是单独的参数一样,因此有效地将数组块中的两行作为单独的数组参数传递。
使用 null
回调调用 array_map()
执行数组参数的“转置”,如 示例 #4 所述PHP Docs for the function中的,它将示例中的2x4数组转换为4x2数组,给出
array(4) {
[0]=>
array(2) {
[0]=>
string(1) "a"
[1]=>
string(1) "e"
}
[1]=>
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "f"
}
[2]=>
array(2) {
[0]=>
string(1) "c"
[1]=>
string(1) "g"
}
[3]=>
array(2) {
[0]=>
string(1) "d"
[1]=>
string(1) "h"
}
}