我想将每个值重复 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);
}
str_repeat
创建单个字符串,而不是数组。
使用
array_fill()
创建一个包含 N 个值副本的数组。然后将数组附加到结果中。
foreach ($chars as $char) {
$result = array_merge($result, array_fill(0, 3, $char));
}
由于您知道重复次数,因此可以使用
foreach
和 for
获得所需的输出
$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
。无需循环即可完成,因为
array_fill
将采用数组:
$result = array_merge(...array_fill(0, 3, $chars));
或者你可以使用字符串:
$result = str_split(str_repeat(implode($chars), 3));
如果需要,只需
sort
即可获取您显示的订单。
为了完整性,我将添加更多技术。利用神奇数字 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);