类似于 PHP 的功能如何explode
用implode
APL 实现?
我试图自己解决这个问题,并想出了一个我在下面发布的解决方案。我想看看其他可能解决这个问题的方法。
爆炸:
给定以下文本字符串和分隔符字符串:
F←'CAT BIRD DOG'
B←' '
Explode 可以如下完成:
S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P[2] ⍝ returns BIRD
限制:
当两个分隔符彼此相邻时,PHP 的explode 函数返回一个空数组值。上面的代码只是忽略了这一点,并将两个分隔符视为一个分隔符。
上面的代码也没有处理重叠的分隔符。如果将重复字符用作分隔符,则最有可能发生这种情况。例如:
F←'CATaaaBIRDaaDOG'
B←'aa'
S←⍴,B
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂B⍷F)⊂F
P ⍝ returns CAT BIRD DOG
但是,预期的结果是CAT aBIRD DOG
因为它没有将“aaa”识别为后跟“a”的分隔符。相反,它将其视为两个重叠的定界符,最终充当单个定界符。另一个例子是'tat' 作为分隔符,在这种情况下,'tatat' 字符串中的任何出现都会有同样的问题。
重叠分隔符:
对于单个重叠的可能性,我有另一种选择:
S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F
第三行代码消除了出现在距S-1
其之前的任何定界符位置的字符距离内的任何字符串位置。正如我所说,这只解决了单个重叠的问题。如果有两个或多个重叠,则第一个被识别为分隔符,其余的都被忽略。这是两个重叠的示例:
F←'CATtatatatBIRDtatDOG'
B←'tat'
S←⍴,B
A←B⍷F
A←(2×A)>⊃+/(-S-⍳S)⌽¨S⍴⊂A
P←(⊃~∨/(-S-⍳S)⌽¨S⍴⊂A)⊂F
P ⍝ returns CAT atatBIRD DOG
预期的结果是“CAT a BIRD DOG”,但由于重叠,它无法将最终的“tat”识别为分隔符。这种情况很少见,除非使用重复的字符。如果分隔符为“aa”,则“aaaa”将被视为双重重叠,并且只会识别第一个分隔符。
内爆:
简单得多:
P←'CAT' 'BIRD' 'DOG'
B←'-'
(⍴,B)↓∊B,¨P
它按预期返回“CAT-BIRD-DOG”。
Pé,对 APL 中标准问题的“短”和/或“优雅”解决方案的追求比 PHP 更早,甚至比新术语(例如“eplode”、“implode”)更早(我认为 - 但我必须承认我不知道这些术语到底有多老...)。无论如何,早期的 APL 人使用术语“成语”来表示“适合 APL 一行的标准问题的解决方案”。出于某种原因,芬兰人特别有创意,甚至开始制作一份清单,以方便新手使用。我发现这些东西在做 APL 20 年后仍然有用。它被称为“FinnAPL”——芬兰 APL 成语库,您可以在这里浏览它:http://aplwiki.com/FinnAplIdiomLibrary (顺便说一句,整个 APL-Wiki 可能会很有趣……
但是,您可能需要在措辞上有所创意才能找到解决方案;)还有一个警告:FinnAPL 仅适用于“经典”(非嵌套)数据结构(嵌套矩阵与“APL2”一起使用,这是标准的这些天),因此他们处理数据的某些方式可能不再是“最先进的”。(即回到“旧时代”,CAT BIRD 和 DOG 将被表示为 3x4 数组,因此字符串数组的“内爆”很简单,array,delimeter
(但您随后面临删除插入用于填充的空白的挑战.
无论如何,我不确定我为什么要写这一切——只是在考虑我从 APL 开始时想到的一些想法;-)
好的,让我也看看这个问题。当您的分隔符是单个字符时,APL2ish 惯用的处理方式将是这样的:
⎕ml←3 ⍝ "migration-level" (only Dyalog APL) to ensure APL2-compatibility
s←' '
A←s,'BIRD',s,'CAT',s,'DOG' ⍝ note that delimeter also used as 1st char!
exploded_string←1↓¨(+\A=s)⊂A ⍝ explode
imploded←∊s,¨exploded_string
A≡imploded ⍝ test for successfull round-trip should return 1
一个有趣的内爆替代方法可以通过减少来完成:
p←'cat' 'bird' 'dog'
↑{⍺,'-',⍵}/p
cat-bird-dog
此技术不需要显式引用分隔符的形状。
一个有趣的explode替代方法可以通过n-wise归约来完成:
f←'CATtatBIRDtatDOG'
b←'tat'
b{(~(-⍴⍵)↑(⍴⍺)∨/⍺⍷⍵)⊂⍵}f
CAT BIRD DOG
Explode() 函数将一个字符串划分为一个数组,但 implode function() 从数组的元素中返回或组合一个字符串。
爆炸示例:
<?php
$str = "india australia";
$str = explode(" ", $string); //here string delimeter is space
Ouput:
$str[0] = india ;
$str[1] = australia ;
?>
内爆:
<?php
$array = array('india','australia','srilanka');
$comma_separated = implode(",",$array); //here comma is separated
echo $comma_separated;
?>
Output:
indiaaustraliasrilanka