对平面数组中连续重复的值进行分组,并将每组内的值连接起来

问题描述 投票:0回答:5

如何将数组分成相同元素(连接字符)的组。 例如,我有这个数组:

Array(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 2
    [4] => 2
    [5] => 1
)

并且想要将所有相同的数字分组在一个元素中,通过串联将它们组合在一起以获得如下所示的结果:

Array(
    [0] => 111
    [1] => 22
    [2] => 1
)
php arrays concatenation grouping repeat
5个回答
2
投票

通过将所有相同的元素连接在一起来将它们分组(不适用于仅连接相邻的相同元素)

$arr = array (1,1,1,2,2,1);
$sum = array_count_values($arr);
array_walk($sum, function(&$count, $value) { 
  $count = str_repeat($value, $count); 
});
print_r($sum);

输出

数组( [1] => 1111 [2] => 22 )

或者仅连接相邻的相同元素

$prev=null; 
$key=0; 
foreach ( $arr as $value ) { 
  if ($prev == $value){ 
    $res[$key] .= $value;
  } else { 
    $key++; 
    $res[$key] = $value; 
    $prev=$value; 
  } 
}
print_r($res);

输出

数组( [1] => 111 [2] => 22 [3] => 1 )


1
投票

这里有两个函数 1 会回来

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

    [2] => Array
        (
            [0] => 2
            [1] => 2
        )

) 

作为输出,第二个将返回

Array
(
    [1] => 1111
    [2] => 22
)

作为输出

$array = array(
    1,1,1,2,2,1
);

print_r(groupArray($array));

print_r(groupSame($array));


function groupArray($array){
    $temp = array();
    foreach($array as $value){
        if(!isset($temp[$value])){
            $temp[$value] = array();
        }
        array_push($temp[$value],$value);
    }
    return $temp;
}

function groupSame($array){
    $temp = array();
    foreach($array as $value){
        if(!isset($temp[$value])){
            $temp[$value] = "";
        }
        $temp[$value] .= $value;
    }
    return $temp;
}

0
投票
<?php
$i=0;
foreach($Arrays as $key=>$val) {
    if (!isset($array[$i]))
       $array[$i]=$val;
    else if (!isset($mem) || $val==$mem)
       $array[$i]=10*$array[$i]+$mem;
   else
     $i++;
   $mem=$val;
}
?>

0
投票
$array = array(1,1,1,2,2,1);
$start = "";
$new_array = array();
foreach($array as $v){
    $v = (string)$v; 
    if($start==$v){
        $count = count($new_array) - 1;
        $val = $new_array[$count].$v;
        $new_array[$count] = $val;
    } else{
        $new_array[] = $v;
    }
    $start = $v;    
}
var_dump($new_array);

已测试并正常工作..

输出 >

array(3) { [0]=> string(3) "111" [1]=> string(2) "22" [2]=> string(1) "1" }


0
投票

您可以通过将引用推入结果数组来避免跟踪分组键。

引用将组的共享值作为键进行缓存。当某个值与该键不匹配时,销毁整个引用并创建一个新引用。

代码:演示

$array = [1,1,1,2,2,1];

$result = [];
foreach ($array as $v) {
    if (!isset($ref[$v])) {
        unset($ref);
        $ref[$v] = $v;
        $result[] =& $ref[$v];
    } else {
        $ref[$v] .= $v;
    }
}
var_export($result);

输出:

array (
  0 => '111',
  1 => '22',
  2 => 1,
)
© www.soinside.com 2019 - 2024. All rights reserved.