Convert string to array at different character occurence

戏子无情 提交于 2019-12-10 10:35:45

问题


Consider I have this string 'aaaabbbaaaaaabbbb' I want to convert this to array so that I get the following result

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

How to go about this in PHP?


回答1:


I have written a one-liner using only preg_split() that generates the expected result with no wasted memory (no array bloat):

Code (Demo):

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

Output:

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

Pattern:

(.)         #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

The real magic happens with the \K, for more reading go here. The NULL parameter in preg_split() means "unlimited matches". This is the default behavior but it needs to hold its place in the function so that the next parameter is used appropriately as a flag The final parameter is PREG_SPLIT_NO_EMPTY which removes any empty matches.


Sahil's preg_match_all() method preg_match_all('/(.)\1{1,}/', $string,$matches); is a good attempt but it is not perfect for two reasons:

The first issue is that his use of preg_match_all() returns two subarrays which is double the necessary result.

The second issue is revealed when $string="abbbaaaaaabbbb";. His method will ignore the first lone character. Here is its output:

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

Sahil's second attempt produces the correct output, but requires much more code. A more concise non-regex solution could look like this:

$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);



回答2:


PHP code demo

Regex: (.)\1{1,}

(.): Match and capture single character.

\1: This will contain first match

\1{1,}: Using matched character one or more times.

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

Output:

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

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

)

Or:

PHP code demo

<?php
$string="aaaabbbaaaaaabbbb";
$array=str_split($string);
$start=0;
$end=  strlen($string);
$indexValue=$array[0];
$result=array();
$resultantArray=array();
while($start!=$end)
{
    if($indexValue==$array[$start])
    {
        $result[]=$array[$start];
    }
    else
    {
        $resultantArray[]=implode("", $result);
        $result=array();

        $result[]=$indexValue=$array[$start];
    }
    $start++;
}
$resultantArray[]=implode("", $result);
print_r($resultantArray);

Output:

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


来源:https://stackoverflow.com/questions/42991284/convert-string-to-array-at-different-character-occurence

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!