如何使用APL实现类似于PHP的explode
和implode
的功能?
我试图自己解决这个问题并提出了一个我在下面发布的解决方案。我想看看其他方法可以解决这个问题。
答案 0 :(得分:2)
<强>爆炸:强>
给出以下文本字符串和分隔符字符串:
F←'CAT BIRD DOG'
B←' '
爆炸可以完成如下:
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'。
答案 1 :(得分:2)
然而,您可能需要对您的措辞有创意才能找到解决方案;)
还有一个警告:FinnAPL仅适用于“经典”(非嵌套)数据结构(嵌套矩阵附带“APL2”,这是目前标准的),因此它们处理数据的一些方式可能不再是“最先进的”。 (即回到“旧时代”,CAT BIRD和DOG将被表示为3x4数组,因此字符串数组的“内爆”很简单,因为,array,delimeter
(但你接下来要挑战删除空白插入用于填充。
无论如何,我不知道为什么我写了这一切 - 只是想到我开始使用APL时想到的一些想法; - )
好的,我也来看看这个问题。当您的分隔符是单个字符时,APL2ish-idiomatic处理方式就是这样:
⎕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
答案 2 :(得分:1)
内爆的一个有趣的替代方案可以通过减少来实现:
p←'cat' 'bird' 'dog'
↑{⍺,'-',⍵}/p
cat-bird-dog
此技术不需要明确引用分隔符的形状。
爆炸的一个有趣的替代方案可以通过n减少来完成:
f←'CATtatBIRDtatDOG'
b←'tat'
b{(~(-⍴⍵)↑(⍴⍺)∨/⍺⍷⍵)⊂⍵}f
CAT BIRD DOG
答案 3 :(得分:0)
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