3

类似于 PHP 的功能如何explodeimplodeAPL 实现?

我试图自己解决这个问题,并想出了一个我在下面发布的解决方案。我想看看其他可能解决这个问题的方法。

4

4 回答 4

2

爆炸:

给定以下文本字符串和分隔符字符串:

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”。

于 2013-06-26T13:01:59.847 回答
2

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
于 2013-06-27T05:19:53.827 回答
1

一个有趣的内爆替代方法可以通过减少来完成:

      p←'cat' 'bird' 'dog'
      ↑{⍺,'-',⍵}/p
cat-bird-dog

此技术不需要显式引用分隔符的形状。

一个有趣的explode替代方法可以通过n-wise归约来完成:

      f←'CATtatBIRDtatDOG'
      b←'tat'
      b{(~(-⍴⍵)↑(⍴⍺)∨/⍺⍷⍵)⊂⍵}f
 CAT  BIRD  DOG 
于 2013-06-27T00:23:30.263 回答
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
于 2013-08-06T06:01:40.223 回答