【问题标题】:Opposite of array_chunk [duplicate]与array_chunk相反[重复]
【发布时间】:2012-05-22 22:26:06
【问题描述】:

array_chunk 使用块大小将一个数组拆分为多个数组以进行切割。

如果我有一个值数组,而我只想要一个大值数组怎么办?

我可以使用array_merge,但这需要我枚举所有子数组,其中可能有一个可变编号。

目前,我的解决方案是:

foreach($input as $tmp) {foreach($tmp as $val) {
    ...
}}

但这有点混乱,只有在我想使用这些值时才有效。如果我想将数组存储在某个地方怎么办?

编辑:输入来自一组<select multiple> 框,用于从多个类别中选择项目。每个项目都有一个全局唯一的(项目之间)ID,所以我只想将输入组合成一个数组并遍历它。

输入可能如下所示:

[[4,39,110],[9,54,854,3312,66950],[3]]

预期输出:

[4,39,110,9,54,854,3312,66950,3]

或:

[3,4,9,29,54,110,854,3312,66950]

【问题讨论】:

  • 你能举一个输入和预期输出的具体例子吗?
  • @MihaiIorga 我只是json_decoded ;) 我会用一个例子来编辑。
  • 多选时你使用的字段名是什么?

标签: php arrays


【解决方案1】:

虽然 PHP 没有内置方法来展平数组,但您可以使用 array_reducearray_merge 实现相同的目的。像这样:

$newArray = array_reduce($array, function ($carry, $item) {
    return array_merge($carry, $item);
}, []);

这应该作为array_chunk的逆运算。

【讨论】:

【解决方案2】:

代码:

$array = [[4,39,110], [9,54,854,3312,66950], [3]];
$array = call_user_func_array('array_merge', $array);

print_r($array);

结果:

Array
(
    [0] => 4
    [1] => 39
    [2] => 110
    [3] => 9
    [4] => 54
    [5] => 854
    [6] => 3312
    [7] => 66950
    [8] => 3
)

【讨论】:

  • 最好的单线,没有任何复杂性。这应该是公认的答案。
  • @Jay 问题是:1.这是一个低价值的代码答案,2.这个建议是非常古老的新闻。 stackoverflow.com/a/14972389/2943403
【解决方案3】:

摘自 array_values 上的 PHP 文档:

/** 
 * Flattens an array, or returns FALSE on fail. 
 */ 
function array_flatten($array) { 
  if (!is_array($array)) { 
    return FALSE; 
  } 
  $result = array(); 
  foreach ($array as $key => $value) { 
    if (is_array($value)) { 
      $result = array_merge($result, array_flatten($value)); 
    } 
    else { 
      $result[$key] = $value; 
    } 
  } 
  return $result; 
}

PHP 没有本地方法来展平数组......所以你去吧。

【讨论】:

  • 嗯...很好的答案,但我想我会在效率方面更好地保持我正在做的事情,至少现在是这样。
  • 他的答案和你的一样高效,只是多一点文字,它可以做多级数组。但是请注意,它会覆盖重复的键(请参阅codepad.org/JPaFgYRt
  • 高效,是的,但是如果我必须循环遍历结果来进行处理,那就不值得了。这回答了这个问题,因为它是折叠数组的一个很好的解决方案,但如果它在那里被使用,它只是开销。
【解决方案4】:

对不起,如果我错了,但是如果我们将在多个选择组中使用相同的名称,那么它将产生一个预期的数组。

<?php
echo '<pre>';
print_r($_POST['cat']);
?>
<form method="post">
<select name="cat[]" multiple="multiple">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>

<select name="cat[]" multiple="multiple">
<option value="22">2</option>
<option value="33">3</option>
</select>

<select name="cat[]" multiple="multiple">
<option value="111">111</option>
<option value="222">222</option>
<option value="333">333</option>
<option value="444">444</option>
</select>
<input name="" type="submit" />
</form>

输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 22
    [5] => 33
    [6] => 222
)

【讨论】:

  • 事实上,这将避免额外的服务器端处理。如果不需要知道 id 来自哪个类别/选择,这是最明智的选择。 @Niet
  • 吹毛求疵:与选项文本相同时,不需要声明选项`value`。
【解决方案5】:

在这种情况下,将数组转换为参数列表的“...”运算符非常方便 (https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list)。

array_chunk() 的逆可能是这样的:

array_merge(...$chunks);

例子:

print_r(array_merge(...[[0,1,2],[3,4,5]]));

输出:

Array
(
   [0] => 0
   [1] => 1
   [2] => 2
   [3] => 3
   [4] => 4
   [5] => 5
)

【讨论】:

猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2020-11-22
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多