Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于连续出现缩短数组 我正在学习PHP,下面列出了相关的问题。语言并不重要,所以我将用伪代码向您介绍这一点。当然,伪代码答案很好_Php_Arrays_Algorithm - Fatal编程技术网

基于连续出现缩短数组 我正在学习PHP,下面列出了相关的问题。语言并不重要,所以我将用伪代码向您介绍这一点。当然,伪代码答案很好

基于连续出现缩短数组 我正在学习PHP,下面列出了相关的问题。语言并不重要,所以我将用伪代码向您介绍这一点。当然,伪代码答案很好,php,arrays,algorithm,Php,Arrays,Algorithm,比如说,有一个由两个不同的重复元素组成的列表——例如,两个单个字符。因此,我的列表大致如下所示: myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...] myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...] myList* = shorten(myList) 然而,这不是我想要的形式。相反,列表应如下所示: myList = [C, C, D, C, D, D, D, C, C, D, C,

比如说,有一个由两个不同的重复元素组成的列表——例如,两个单个字符。因此,我的列表大致如下所示:

myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...]
myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...]
myList* = shorten(myList)
然而,这不是我想要的形式。相反,列表应如下所示:

myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...]
myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...]
myList* = shorten(myList)
将单个字符列表转换为包含后续字符连续字符串作为元素的列表,最优雅的方法是什么?我觉得我的解决方案相当糟糕,因为它涉及多重嵌套的if语句、各种状态变量和其他不好的方面

伪代码走开!非常感谢您对本协议的任何实施

shorten()

你向我扔东西。

你可以通过跟踪当前字符和最后一个字符,对数组进行一次扫描:

function shorten($myList) {
        $myList[] = '';                         // add a dummy char at the end of list.
        $result = array();                      // result to be returned.
        $last_char = $myList[0];                // initilize last char read.
        $combine = $last_char;                  // initilize combined string.
        for($i=1;$i<count($myList);$i++) {      // go from index 1 till end of array.
                $cur_char = $myList[$i];        // current char.
                if($cur_char != $last_char) {   
                        $result[] = $combine;   // time to push a new string into result.
                        $combine = $cur_char;   // reset combine string.
                } else {
                        $combine.=$cur_char;    // is cur char is same as prev..append it.
                }
                $last_char = $cur_char;         // for next iteration cur become last.
        }
        return $result;                         // return result.
}
函数缩短($myList){
$myList[]='';//在列表末尾添加一个虚拟字符。
$result=array();//要返回的结果。
$last_char=$myList[0];//初始化上次读取的字符。
$combine=$last_char;//初始化组合字符串。
对于($i=1;$i
$myList=array('C','C','D','C','D','D','D','C','C','D','C','C','C');
函数(列表){
$newList=array();
foreach($key=>$entry){
如果($key==0){
$newList[]=$entry;
}elseif($entry==substr($newList[count($newList)-1],0,1)){
$newList[计数($newList)-1]。=$entry;
}否则{
$newList[]=$entry;
}
}
返回$newList;
}
$shortenedList=缩短($myList);
var_dump($myList);
回声“
”; var_dump($shortenedList);
使用PHP 5.3闭包和:


比Max的答案短一点

$mylist = array("a","b","b","b","c","c","d");
function shorten($array) {
  $str = implode("",$array); // step 1: make string from array of chars
  preg_match_all("/(\w)\\1*/",$str,$matches); // step 2: split into chunks
  return $matches[0]; // step 3: that's all
}
print_r(shorten($mylist));

您可能会在代码的第三行收到未定义的偏移量-1,但我非常喜欢这个解决方案。@[Jan Turoň]您明白了。是的,我通过设置错误级别来排除E_通知错误,这有点作弊。-@[Jan Turoň]我更新了代码,添加了一行,但现在它不会接受错误,也不会计算每次迭代两次$a的长度。
$mylist = array("a","b","b","b","c","c","d");
function shorten($array) {
  $str = implode("",$array); // step 1: make string from array of chars
  preg_match_all("/(\w)\\1*/",$str,$matches); // step 2: split into chunks
  return $matches[0]; // step 3: that's all
}
print_r(shorten($mylist));