将字符串转换为不同字符出现的数组

时间:2017-03-24 04:11:57

标签: php arrays split duplicates

考虑我有这个字符串'aaaabbbaaaaaabbbb'我想将它转换为数组,以便得到以下结果

$array = [
    'aaaa',
    'bbb',
    'aaaaaa',
    'bbbb'   
]

如何在PHP中解决这个问题?

2 个答案:

答案 0 :(得分:5)

PHP code demo

正则表达式:x

fn main() { let (x, y) = (1, 3); println!("X is {} and Y is {}", x, y); let x: i32 = 565; println!("Now X is {}", x); } :匹配并捕获单个字符。

(.)\1{1,}:这将包含第一场比赛

(.):使用匹配的字符一次或多次。

\1

<强>输出:

\1{1,}

PHP code demo

<?php
ini_set("display_errors", 1);
$string="aaaabbbaaaaaabbbb";
preg_match_all('/(.)\1{1,}/', $string,$matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => aaaa
            [1] => bbb
            [2] => aaaaaa
            [3] => bbbb
        )

[1] => Array
    (
        [0] => a
        [1] => b
        [2] => a
        [3] => b
    )

)

答案 1 :(得分:0)

我只使用preg_split()编写了一行内容,生成了没有浪费内存的预期结果(没有阵列膨胀):

代码(Demo):

$string='aaaabbbaaaaaabbbb';
var_export(preg_split('/(.)\1*\K/',$string,NULL,PREG_SPLIT_NO_EMPTY));

输出:

array (
  0 => 'aaaa',
  1 => 'bbb',
  2 => 'aaaaaa',
  3 => 'bbbb',
)

模式:

(.)         #match any single character
\1*         #match the same character zero or more times
\K          #keep what is matched so far out of the overall regex match

真正的魔法发生在\K,更多阅读hereNULL中的preg_split()参数表示“无限制匹配”。这是默认行为,但它需要在函数中保留其位置,以便下一个参数适当地用作flag 最后一个参数是PREG_SPLIT_NO_EMPTY,它会删除所有空匹配。

Sahil的preg_match_all()方法preg_match_all('/(.)\1{1,}/', $string,$matches);是一个很好的尝试,但由于两个原因它并不完美:

第一个问题是他使用preg_match_all()返回两个子阵列,这是必要结果的两倍。

$string="abbbaaaaaabbbb";时会显示第二个问题。他的方法将忽略第一个孤独的角色。这是它的输出:

Array (
    [0] => Array
        (
            [0] => bbb
            [1] => aaaaaa
            [2] => bbbb
        )
    [1] => Array
        (
            [0] => b
            [1] => a
            [2] => b
        )
)

Sahil的第二次尝试产生了正确的输出,但需要更多的代码。更简洁的非正则表达式解决方案可能如下所示:

$array=str_split($string);
$last="";
foreach($array as $v){
    if(!$last || strpos($last,$v)!==false){
        $last.=$v;
    }else{
        $result[]=$last;
        $last=$v;
    }
}
$result[]=$last;
var_export($result);