繁体   English   中英

根据重复元素的数量对PHP中的多维关联数组进行排序/限制

[英]Sorting/limiting the multidimensional associative array in PHP based on the number of repeated elements

我在PHP中有一个多维数组,如下所示:

$array = Array ( 
        [0] => Array ( [bill] => 1 ) 
        [1] => Array ( [bill] => 1 ) 
        [2] => Array ( [bill] => 1 ) 
        [3] => Array ( [bill] => 1 )        
        [4] => Array ( [jack] => 5 ) 
        [5] => Array ( [jack] => 5 ) 
        [6] => Array ( [jake] => 6 ) 
        [7] => Array ( [jake] => 6 ) 
        [8] => Array ( [jake] => 6 ) 
        [9] => Array ( [jake] => 6 ) 
        [10] => Array ( [sara] => 7 ) 
        [11] => Array ( [sara] => 7 ) 
        [12] => Array ( [sara] => 7 ) 
        [13] => Array ( [sara] => 7 ) 
        [14] => Array ( [william] => 8 ) 
        [15] => Array ( [william] => 8 ) 
        [16] => Array ( [william] => 8 ) 
        [17] => Array ( [william] => 8 ) 
        [19] => Array ( [william] => 8 ) 
        [20] => Array ( [martin] => 9 ) 
        [21] => Array ( [martin] => 9 ) 
        [22] => Array ( [martin] => 9 ) 
        [23] => Array ( [tara] => 10 ) 
        [24] => Array ( [tara] => 10 ) 
        [25] => Array ( [tara] => 10 )              
        [26] => Array ( [tara] => 10 )              
      );

我想将$array转换$array $result以便它可以首先根据相似元素的数量对数组进行排序,然后返回前五个值。 例如, $array有五个相似的[william] => 8 ,四个相似的[bill] => 1 ,四个相似的[jake] => 6 ,四个相似的[sara] => 7 ,四个相似的[tara] => 10$array变量中的三个相似的[martin] => 9和两个相似的[jack] => 5 因此,具有最重复的前五个元素的$result变量应如下所示:

$result = Array (
        [0] => Array ( [william] => 8 ) 
        [1] => Array ( [bill] => 1 ) 
        [2] => Array ( [jake] => 6 ) 
        [3] => Array ( [sara] => 7 ) 
        [4] => Array ( [tara] => 10 ) 
      );

您能帮我解决这个问题吗?

创建一个组合键和值的新数组,并使用array_count_values计数出现的次数。 最后排序并检索前5名。

$new = array();      

foreach($array as $key => $value) {
    $new[] = key($value) . '_' . current($value);
}

$counts = array_count_values($new);
arsort($counts);
$results = array();

foreach(array_splice($counts,0,5) as $key => $count) {
    $key = explode('_',$key);
    $results[] = array($key[0] => $key[1]);
}

print_r($results);
$result = array();
$occurrence_map = array();
$pair_map = array();

foreach( $array as $record )
{
    $key = key($record);
    $pair_map[ $key ] = $record;
    ++$occurrence_map[ $key ];
}

while( 5 > count($result) && !empty($occurrence_map) )
{
    $related_key = '';
    $max_value = $occurrence_map[ key($occurrence_map) ];

    foreach( $occurrence_map as $key => $value )
    {
        if( $value > $max_value )
        {
            $max_value = $value;
            $related_key = $key;
        }
    }

    $result[] = $pair_map[$related_key];
    unset( $occurrence_map[$related_key] );
}

结果:

array(5) {
  [0]=>
  array(1) {
    ["william"]=>
    int(8)
  }
  [1]=>
  array(1) {
    ["bill"]=>
    int(1)
  }
  [2]=>
  array(1) {
    ["jake"]=>
    int(6)
  }
  [3]=>
  array(1) {
    ["sara"]=>
    int(7)
  }
  [4]=>
  array(1) {
    ["tara"]=>
    int(10)
  }
}

希望这对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM