【问题标题】:Array grouping valus with count [duplicate]数组分组值与计数[重复]
【发布时间】:2013-10-03 17:37:03
【问题描述】:

我有一个包含值的数组

Munnar, Cochin, Cochin, Cochin, Munnar, Cochin

我需要将值分组为

Munnar(1), Cochin(3), Munnar(1), Cochin(1)

如何循环数组以获得所需的输出。

【问题讨论】:

  • 您可以使用array_count_values()。它会给你数组
  • 它会给出类似 munnar(2)、Cochin(4) 的答案。我需要与上面完全相同的结果

标签: php arrays


【解决方案1】:

你可以这样做:

<?
$arrAux = array('Munnar', 'Cochin', 'Cochin', 'Cochin', 'Munnar', 'Cochin');

$count = 0;
$previous = $arrAux[0];
foreach ($arrAux as $name){
  if ($previous === $name)
     $count++;
  else{
     echo "{$previous}({$count})";
     $previous = $name;
     $count = 1;
  }
}
//Print last item
echo "{$previous}({$count})";
?>

这应该做的工作,我认为你不想使用array_count_values。这个功能一分钟搞定了,或许可以改进一下:)

【讨论】:

  • 他已经有数组了:)不用炸!!
  • 正确,我会编辑我的答案,谢谢
  • 工作正常..好!为此 +1。
【解决方案2】:

试试这个

  $arr = array('Munnar','Cochin','Cochin','Cochin','Munnar','Cochin');

$count = 0;
$previous=$arr[0]; 
$output = "";
 foreach($arr as $key=>$val)
{
    if($arr[$key]==$previous){
      $count++;
    }
   else
   {
      $output .= $previous."(".$count.")";
     $count=1;
     $previous= $arr[$key];
   }
} 

if($previous==$arr[count($arr)-1])
    $output.=$previous."(".$count.")";


echo $output;

【讨论】:

  • 这个函数将计算第一个元素的两倍并且不会显示最后一个元素,这就是为什么我在foreach完成时打印最后一个元素
  • 这将打印最后一项:)
【解决方案3】:

试试这个

$array = array('Munnar','Cochin','Cochin','Cochin','Munnar','Cochin');
$vals = array_count_values($array);
echo 'No. of NON Duplicate Items: '.count($vals).'<br><br>';

  foreach($vals as $key=>$val){
echo $key."(".$val."),";
}

输出:

Munnar(2),Cochin(4)

【讨论】:

  • 我想要像 [Munnar] => 1, [Cochin] => 3, [Munnar] => 1 , [cochin] => 1 的数组
  • 好的,请稍候@Nisanth
  • @Nisanth 你想要 Munnar(1), Cochin(3), Munnar(1), Cochin(1) 这个输出或 [Munnar] => 1, [Cochin] => 3, [Munnar ] => 1 , [cochin] => 1 这个输出请解释一下
【解决方案4】:
//print_r( array_count_values($yourarray));

$array=array_count_values($yourarray);

现在您可以遍历 $array 以获得所需的结果。

【讨论】:

  • 不完全是用户要求的......
  • @Chandresh 我猜他是在要求包含值计数的数组。
  • 不,他要的是连续值的计数,所以像 (Munnar,Cochin,Munnar,Cochin,Munnar,Cochin) 这样的数组将打印 Munnar(1), Cochin(1), Munnar(1), Coching(1), Munnar(1), Cochin(1)
【解决方案5】:

代码:

<?php
$key = '';
$_n = array();
$_a = array('Munnar', 'Cochin', 'Cochin', 'Cochin', 'Munnar', 'Cochin');
foreach ($_a as $_1) {
    if ($key != $_1) {
        $idx = count($_n[$_1]);
        if ( isset($_n[$_1][$idx]) ) $idx += 1;
        $_n[$_1][$idx] = 1;
        $key = $_1;
    }
    else {
        $idx = count($_n[$_1]) -1;
        $_n[$_1][$idx] += 1;
    }
}


foreach ($_n as $k1=>$v1) {
    foreach ($v1 as $k2=>$v2) {
        echo 'Key: '.$k1.', Index:'.$k2.', Value:'.$_n[$k1][$k2].'<br/>';
    }
}
?>

结果

Key: Munnar Index:0 Value:1
Key: Munnar Index:1 Value:1
Key: Cochin Index:0 Value:3
Key: Cochin Index:1 Value:1

如果您需要问题中的确切顺序

Munnar(1), Cochin(3), Munnar(1), Cochin(1)

您可以使用上述方法并在最内层循环分配一个新数组,如下所示:

$new_arr[] = array( $k1 => $_n[$k1][$k2] );

警告:确保在第一次比较时起始键总是不同的。

【讨论】:

    【解决方案6】:

    我对PHP不是很了解,但是你可以试试:

    $array = array('Munnar','Cochin','Cochin','Cochin','Munnar','Cochin');
    
    $prev = "";
    $count = 0;
    
    foreach($array as $key)
    {
       if(empty($prev))
       {
           $prev = $key;
           $count = 1;
           continue;
       }
    
       if($prev === $key)
       {
          $count++;
       } else {
          echo "($prev)($count)";
          $prev = $key;
          $count = 1;
       }
    }
    
    echo "($prev)($count)";
    

    【讨论】:

    • 给出输出 ()(0)(Munnar)(1)(Cochin)(3)(Munnar)(1)(Cochin)(1) 这是不期望的..
    • 感谢提示,我编辑了我的答案
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2017-06-28
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多