将平面数组中的每个字符串复制 N 次

问题描述 投票:0回答:4

我想将每个值重复 3 次并按正确的顺序排列。应使用其自身的 3 个副本来代替每个原始元素。

给定以下一维字符串数组:

$chars = ["a", "b", "c"];

所以结果是:

$duplicatedChars = ["a", "a", "a", "b", "b", "b", "c", "c", "c"];

我尝试过使用

str_repeat()
,但这不会创建单独的字符串。

此尝试没有创建足够的元素,它仅重复每个元素中的字符串。

$result = [];
foreach ($chars as $char) {
    $result[] = str_repeat($char, 3);
}
php arrays repeat
4个回答
2
投票

str_repeat
创建单个字符串,而不是数组。

使用

array_fill()
创建一个包含 N 个值副本的数组。然后将数组附加到结果中。

foreach ($chars as $char) {
    $result = array_merge($result, array_fill(0, 3, $char));
}

1
投票

由于您知道重复次数,因此可以使用

foreach
for

获得所需的输出
  1. 循环原始数组
  2. $repeat + 1
    次;将字符推至
    $result
<?php

$chars = ["a", "b" , "c"];
$result = [];
$repeat = 3;

foreach ($chars as $char) {
    for ($i = 0; $i < $repeat; $i++) {
        $result[] = $char;
    }
}
    
var_dump($result);
array(9) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "a"
  [3]=>
  string(1) "b"
  [4]=>
  string(1) "b"
  [5]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "c"
  [8]=>
  string(1) "c"
}

在线尝试!


@Barmar的回答有相同的“想法”,但使用

  • array_merge
    改为关闭
    $result[] = ;
  • array_fill
    而不是额外的
    for

0
投票

无需循环即可完成,因为

array_fill
将采用数组:

$result = array_merge(...array_fill(0, 3, $chars));

或者你可以使用字符串:

$result = str_split(str_repeat(implode($chars), 3));

如果需要,只需

sort
即可获取您显示的订单。


0
投票

为了完整性,我将添加更多技术。利用神奇数字 3 的解决方案将更具可扩展性,但我还将展示一些可扩展性较差的方法,这些方法将变量或操作重复 3 次。

  • 无体循环将每个元素推入新数组 3 次:(Demo)

    $result = [];
    foreach (array_chunk($chars, 1) as [0 => $result[], 0 => $result[], 0 => $result[]]);
    var_export($result);
    

  • 每次迭代时调用

    array_fill()
    array_merge()
    的功能循环:(Demo)

     var_export(
         array_reduce(
             $chars,
             fn($result, $v) => array_merge($result, array_fill(0, 3, $v)),
             []
         )
     );
    

  • 转置并展平输入数组的 3 个副本:(Demo)

     var_export(
         array_merge(...array_map(null, $chars, $chars, $chars))
     );
    

    或:(演示

     var_export(
         array_merge(...array_map(null, ...array_fill(0, 3, $chars)))
     );
    

  • 循环调用

    array_fill()
    ,并将其返回的数组展开作为
    array_push()
    的参数:(Demo)

     $result = [];
     foreach ($chars as $char) {
         array_push($result, ...array_fill(0, 3, $char));
     }
     var_export($result);
    

  • 循环调用

    array_pad()
    ,最大数组数量不断增长:(演示

     $result = [];
     foreach ($chars as $char) {
         $result = array_pad($result, count($result) + 3, $char);
     }
     var_export($result);
    

  • A

    for()
    循环在每次迭代时调用
    array_fill()
    array_splice()
    :(Demo)

     for ($i = count($chars) - 1; $i >= 0; --$i) {
         array_splice($chars, $i, 1, array_fill(0, 3, $chars[$i]));
     }
     var_export($chars);
    
© www.soinside.com 2019 - 2024. All rights reserved.