【问题标题】:Push static element between every original element of an array [duplicate]在数组的每个原始元素之间推送静态元素[重复]
【发布时间】:2022-10-09 17:32:17
【问题描述】:

我有一个像这样的数组:

$fruit = array('Apple', 'Orange', 'Banana');

我想将数组与类似于 implode 的分隔符结合起来,但没有将结果转换为字符串。

所以而不是

implode('.', $fruit); // 'Apple.Orange.Banana'

结果应该是:

array('Apple', '.', 'Orange', '.', 'Banana');

这可能可以通过循环来实现,但是,我正在寻找最好的解决方案。也许有一个本机功能可以完成我不知道的事情?提前致谢!

【问题讨论】:

  • 我可能会称其为“交错”或“交替”值,但描述很清楚。不过,我没有答案。

标签: php arrays interleave


【解决方案1】:

您可以基于|.|(被管道包围的句点字符)内爆,然后在| 管道字符上爆炸。

<?php

$fruits = array('Apple', 'Orange', 'Banana');

$d = explode("|", implode('|.|', $fruits));

print_r($d);

Online Demo

更新:

正如@RiggsFolly 在 cmets 中提到的那样,您可以使用像 chr(1) 这样非常不可能的字符作为分隔符。

<?php
$fruits = array('Apple', 'Orange', 'Banana');
$sep = chr(1);
$d = explode($sep, implode($sep.'.'.$sep, $fruits));

print_r($d);

Online Demo

【讨论】:

  • 我想了想。问题是如果数组中的字符串包含分隔符(例如“Or|ange”),这将不起作用。
  • @Ood您可以更改分隔符。 | 只是一个选项。此外,在给出答案时添加新的约束也不是很明显。
  • 创建一个非常不可能的字符作为分隔符,例如$sep = chr(1);
  • onecompiler.com/php/3yhg22f42 网站没有循环,当然完全是从@nice_dev 的回答中扯下来的
  • @Ood 很公平,但需要提到条件让我们考虑。没关系。
【解决方案2】:

array_splice() 与反向for 循环一起使用

请记住从count($fruit) 中删除1,这样我们就不会在数组末尾添加另一个.

<?php

$fruit = [ 'Apple', 'Orange', 'Banana' ];
for ($i = count($fruit) - 1; $i > 0; $i--) {
    array_splice($fruit, $i, 0, '.');
}

var_dump($fruit);
array(6) {
  [0]=>
  string(5) "Apple"
  [1]=>
  string(1) "."
  [2]=>
  string(6) "Orange"
  [3]=>
  string(1) "."
  [4]=>
  string(6) "Banana"
}

【讨论】:

  • 谢谢!非常适合我!我会尽快接受。
  • @ood 以为你想避免循环 :)
  • 您可以通过制作二维数组并在之后将其展平来避免循环,但恕我直言,这似乎是最直接的方式。
  • @RiggsFolly 你是对的。但是,我想没有本机函数/单线可以做到这一点,所以如果循环是对我来说最好的解决方案。
  • 可以在Push static value into another array at every nth position找到此答案的较早发布和更动态的版本
【解决方案3】:

选择

依靠array_* 函数,您可以考虑以下几点:

function interleave(string $sep, array $arr): array {
  return array_slice(array_merge(...array_map(fn($elem) => [$sep, $elem], $arr)), 1); 
}

由于使用内置函数并且没有显式循环,它超过了循环 array_splice 实现在 10 个元素标记附近的速度,因此在您的情况下,简洁实现和性能之间的权衡可能是值得的。

解释

当这样调用时:

interleave('.', ['Apple', 'Orange', 'Banana']);

执行以下操作(从内到外):

地图

将每个元素映射到一对['.', $elem]

$mapped = array_map(fn($elem) => ['.', $elem], ['Apple', 'Orange', 'Banana']);

导致:

Array
(
    [0] => Array
        (
            [0] => .
            [1] => Apple
        )

    [1] => Array
        (
            [0] => .
            [1] => Orange
        )

    [2] => Array
        (
            [0] => .
            [1] => Banana
        )

)

合并

利用documentation 中的以下事实,使用array_merge 展平数组:

如果 [...] 数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。

$merged = array_merge(...$mapped);

导致:

Array
(
    [0] => .
    [1] => Apple
    [2] => .
    [3] => Orange
    [4] => .
    [5] => Banana
)

切掉第一个额外的分隔符:

$sliced = array_slice($merged, 1);

导致:

Array
(
    [0] => Apple
    [1] => .
    [2] => Orange
    [3] => .
    [4] => Banana
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多