【问题标题】:Split array in multiple arrays populate by order in PHP在 PHP 中按顺序填充多个数组中的拆分数组
【发布时间】:2018-07-23 04:16:10
【问题描述】:

数组输入:

$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 不同。我想按顺序填充不同的数组,当到达最后一个数组时,返回第一个数组并重复直到没有更多值。

我尝试了很多可能性,但找不到合适的。

【问题讨论】:

  • 单行不一定有利于可读性,但$result = array_map(null, ...array_chunk($input_array, count($input_array) / 2));
  • @MarkBaker 你能解释一下... 在这种情况下做了什么吗?
  • @MarkBaker ... 是否从 list() 之类的数组中提取值?
  • @Don'tPanic 谢谢!

标签: php arrays split sub-array


【解决方案1】:

您可以迭代您的值并使用模数填充数组:

$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"
}

【讨论】:

  • 我也打算提出这个建议。我认为使用foreach ($input_array as $key => $val) 比定义你自己的$key 更简单,但是你这样做的方式确实考虑到了意外的键。
  • @Don'tPanic 你是对的!感谢这个有趣的评论。
【解决方案2】:

单行代码不一定有利于可读性,而这需要解释的事实意味着它不是需要维护的代码的好答案,但是

$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() 执行数组参数的“transpose”,如PHP Docs for the function 中的示例#4 所述,将示例中的 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"
  }
}

【讨论】:

  • 这太酷了!如果它不均分,您是否知道一种方法可以防止它在结果子数组的末尾添加空值?我正在做类似的事情,但一直遇到同样的问题。
  • 不,它总是用空值填充以确保大小一致;实际上,您将其视为必须平衡的矩阵,因此 PHP 通过在必要时填充空值来平衡​​它
【解决方案3】:
$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);

【讨论】:

  • 代码应附有书面说明,说明如何解决 OP 中的问题。
【解决方案4】:

循环遍历索引,按所需的输出数组数递增。然后使用内部循环来获取各个元素。

$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];
    }
}

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多